设为首页 加入收藏

TOP

Linux程序存储结构
2015-02-03 22:27:32 来源: 作者: 【 】 浏览:25
Tags: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、 字符串常量保存在文本段中。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C程序标准及glibc 下一篇Scala隐式转换类遇到的问题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: