Linux程序存储结构

Linux系统下,程序是一个可执行文件,通常是ELF格式。通常,Linux的可执行文件拥有两种内存分配方式:存储时 和 运行时

1、存储时

看实例,下面是对可执行文件aa运行size命令后得到的结果。

[root@xxx1 algriom]# size aa

text      data    bss    dec    hex  filename

1257    500    16  1773    6ed  aa

其中:

text(代码区):表示正文段大小,是CPU执行的机器指令部分,通常,是可共享的,所以即使是频繁执行的程序在存储器中也只需有一个副本;

data(初始化数据区):表示包含静态变量和已经初始化(可执行文件包含了初始化的值)的全局变量的数据段大小;

bss :表示未初始化的全局变量和未初始化的静态变量,称之为未初始化数据段;

PS:第4列和第5列是分别以十进制和十六进制表示的三个段的总长度。

2、运行时(进程结构)

运行时是指一个正在运行的进程在内存空间中的结构,也就是一个进程的结构。

一般包括代码区、初始化数据区、未初始化数据区、堆区和栈区5个部分。

前三者与存储时相同,(1)栈区存储函数参数值、返回值、局部变量等。向下生长

(2)堆区用于动态内存分配。向上生长

堆区和栈区的区别如下:

(1)栈由操作系统自动管理,无需程序员手工控制,而堆区的申请和释放工作由程序员控制。

(2)栈是一块连续的内存区域,由系统预先设定,一般较小,从高地址向低地址增长;而堆是向高地址扩展的数据结构,是不连续的内存区域,空间较大。另外,分配的效率上,栈的分配比堆的分配要高效很多。

结论:

1、 经过初始化的全局变量和静态变量保存在数据段中。

2、 未经初始化的全局变量和静态变量保存在BSS段。

3、 函数内部声明的局部变量保存在堆栈段中。

4、 const修饰的全局变量保存在文本段中,const修饰的局部变量保存在堆栈段中。

5、 字符串常量保存在文本段中。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6aa6ce02aa60b7fa6505a99060bd163e.html