linux下的内存分布

 

 

 

周日讲了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段要低一些,说明静态区的模型也是正确的

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

 

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

我这里还没搞明白。

 

posted on 2016-04-19 11:42  wangzefeng  阅读(427)  评论(0编辑  收藏  举报

导航