标签:区分 虚拟 ring func 类型 line word 使用 log
各位看官们,大家好。上一回中咱们说的是C程序内存布局的样例,这一回咱们继续说该样例。闲话休提,言归正转。让我们一起talk C栗子吧。
看官们,关于C程序内存布局的样例,我们在前面的两个章回都介绍过了,这一回我们将对前面章回中的内容进行总结和提示。
C程序的内存布局主要有四个分区:代码区,数据区(data和bss)。堆区和栈区。能够使用readelf -S filename查看各个分区的内存地址。这四个分区在内存中从低地址空间開始依次向高地址延伸。我们再次使用前面章回中的图直观地展示给大家,而且对这些分区做一个全面的总结。
当中全局变量不用区分静态和非静态。仅仅要是全局变量都在该区域中。
当中全局变量不用区分静态和非静态,仅仅要是全局变量都在该区域中。
总结完分区的内容后。我们结合前面章回中的样例,总结一下样例中各个变量在内存中的分布信息,大家从中能够看到,样例中各个变量在内存中的分布和我们上面总结的内容全然一致。
内存分区 分区起始地址 分区中存放的变量和代码
栈区: 0xbfde3000 存放函数和局部变量:la1,la2,i
堆区: 0x0964d000 存放动态分配的内存空间:p所指向的空间.
数据区中的bss区: 0x0804a038 存放程序中未初始化的全局变量和局部静态变量:ga1,static_la1
数据区中data区: 0x0804a028 存放程序中初始化的全局变量和局部静态变量:ga2,static_la2
代码区: 0x080483e0 存放程序的代码
除了总结外,我们另一些小的细节须要共享给大家。
希望引起大家的注意:
可是程序中堆区和栈区的地址空间是动态变化的。已经有细心的看官发现了,我们在上一回中的样例,执行过两次。位于数据区中的变量地址在两次执行结果中全然一致,可是位于堆区和栈区中的变量地址在两次执行结果中不同样。
这便是最好的证明。
看官们,俗话说的好,当局者迷。旁观者清。在大家细致观察内存中的各个分区时。让我们跳出这些分区之外,从整个内存的角度来做一些说明,希望能把大家就“迷局”中拉出来 。
readelf查看的是程序已经固定的静态信息,像堆,栈这些动态信息,就须要查看proc文件夹中的文件了,该文件夹中的文件提供了程序执行时的实时信息。
各位看官。关于C程序内存布局的样例咱们就讲到这里。欲知后面还有什么样例,且听下回分解 。
一起talk C栗子吧(第一百三十一回:C语言实例--C程序内存布局三)
标签:区分 虚拟 ring func 类型 line word 使用 log
原文地址:http://www.cnblogs.com/lytwajue/p/7295858.html