首页 > 系统服务 > 详细

linux下的内存分布

时间:2016-04-19 13:54:32      阅读:426      评论:0      收藏:0      [点我收藏+]

 

 

 

周日讲了32位linux下的内存分布

 

还有关于C语言中的extern和static的用法

 

内存的最高1G是用作系统保留,接下来是占空间,在靠近3G的那一块

 

再下来是堆空间,之后是bss区,未初始化的静态变量区

 

然后是Rw data区

 

Ro data区,主要用作存储字符串类型

 

接下来是代码段,又名txt正文段

 

0xffffffff

内核 

0xbfff ffff

 

 

 

 

bss区

rw data
ro data

代码段 

0x00000000

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

接下来就是验证

技术分享
 1 #include <stdio.h>
 2 
 3 static int sg_init = 10;
 4 static int sg_uninit ;
 5 
 6 
 7 int main()
 8 {
 9 
10     int l_init = 10;
11     static int init_stack = 10;
12     static int uninit_stack;
13     static int uninit_xxx = 0;
14     
15     printf("sg_init            %p\n",&sg_init);
16     printf("sg_uninit          %p\n",&sg_uninit);
17     printf("l_init             %p\n",&l_init);
18     printf("init_stack         %p\n",&init_stack);
19     printf("uninit_stack       %p\n",&uninit_stack);
20     printf("string,ro data     %p\n","hello");
21     printf("function           %p\n",main);
22 
23 }
View Code

运行结果如下

 

sg_init                 0x804a014
sg_uninit             0x804a024
l_init                   0xbfa0718c
init_stack            0x804a018
uninit_stack        0x804a028
string,ro data      0x80485da
function              0x80483e4

 

可见局部变量是存放在栈空间的,因为比较靠近堆空间0xbf

未初始化的静态全局变量和静态局部变量是紧挨着的,而且比初始化的位置要高一些,所以验证了上述模型

rodata段爷比rwdata段要低一些,说明静态区的模型也是正确的

同理代码段的地址也是符合上述模型。

 

有个不太严谨的证明是局部变量栈空间,如何排除它不是在堆空间?栈空间有多大?

我这里还没搞明白。

 

linux下的内存分布

原文:http://www.cnblogs.com/wangzefeng/p/5407556.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!