[转载]Linux程序存储结构与进程结构
来源:互联网 发布:政府网络建设形式主义 编辑:程序博客网 时间:2024/05/17 02:55
1.Linux可执行文件结构
在Linux系统下,程序是一个普通的可执行文件。可执行文件在存储时分为代码区、数据区和未初始化数据区3个部分。各段基本内容说明如下:
代码区:存放CPU执行的机器指令。通常代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。
代码区的指令包括操作码和操作对象(或对象地址引用)。如果是立即数(即是具体的数值),将直接包含在代码中,如果是局部数据,将在运行时在栈区分配空间,然后再引用该数据的地址,如果是未初始化数据区和数据区,在代码中同样将引用该数据的地址。
全局初始化数据区/静态数据区(数据段),该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。
未初始化数据区,存入的是全局未初始化变量和未初始化静态变量。未初始化数据区的数据在程序开始执行之前被内核初始化为0或者空。
2.Linux进程结构
在Linux系统下,如果将某个可执行文件加载到内存运行,则将演变成一个或多个进程(多个进程的原因是进程在运行时可以再创建新的进程,但加载时只有一个进程)进程是Linux事务管理的基本单元,所有的进程均拥有自己独立的处理环境和系统资源。进程的环境由当前系统状态及其父进程信息决定和组成的。
代码区:加载的是可执行文件代码段,其加载到内存中的位置由加载器完成。
全局初始化数据区/静态数据区:加载的是可执行文件数据段,位置可位于代码段后,也可以分开。程序在运行之初就为该数据段申请了空间,在程序退出时才释放,因此,存储于数据段(全局初始化,静态初始化)的数据的生命周期为整个程序运行过程。
未初始化数据区:加载的是可执行文件未初始化数据段,位置可以分开也可以紧靠数据段。程序在运行之初就为该部分申请了空间,在程序退出时才释放,因此,存储于该部分的数据的生存周期为整个程序运行过程。
栈区:由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行过程中实时加载和释放,因此,局部变量的生存周期为申请到释放该段栈空间的过程。
堆区:用于动态内存分配,堆在内存中位于未初始化数据段区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时,有可能由OS回收。【分而治之,进程的结构和汇编是最接近的】
auto变量:
作用域:一对{}内
生存域:当前函数
存储位置:变量默认存储类型,存储在栈区。
extern函数:
作用域:整个程序
生存域:整个程序运行期
存储位置:函数默认存储类型,代码段。
extern变量:
作用域:整个程序
生存域:整个程序运行期
存储位置:初始化在data段,未初始化在BSS段。
static函数:
作用域:当前文件
生存域:整个程序运行期
存储位置:代码段。
static全局变量:
作用域:当前文件
生存域:整个程序运行期
存储位置:初始化在data段,未初始化在BSS段。
static局部变量:
作用域:一对{}内
生存域:整个程序运行期
存储位置:初始化在data段,未初始化在BSS段。
register变量:
作用域:一对{}内
生存域:当前函数
存储位置:运行时存储在CPU寄存器中。
字符串常量:
2.Linux进程结构