程序在内存中的分布

 

程序在内存中的分布



 在现代的操作系统中,当我们说到内存,往往需要分两部分来讲:物理内存和虚拟内存。从硬件上讲,虚拟空间是CPU内部的寻址空间,位于MMU之前,物理空间是总线上的寻址空间,是经过MMU转换之后的空间。

一般我们所说的程序在内存中的分布指的就是程序在虚拟内存中的存储方式。

从低地址到高地址,可分为下面几段: 
预留内存地址
(操作系统维护的内存地址,不可访问) 
程序代码区(只读,存代码和一些其他的东西); 
data段(存初始化的全局变量和static变量,另外还有文字常量区,常量字符串就是放在这里,程序结束后有系统释放); 
bss段(存未初始化的全局变量和static变量); 
(由低地址向高地址增长,一般new和malloc分配,由程序员分配释放);
共享库文件(调用的库文件,位于堆和栈之间);
 
(由高地址向低地址增长,和堆的增长方式相对,对不同的OS来说,栈的初始大小有规定,可以修改,目前默认一般为2M,由编译器自动分配释放); 
再上面存的都是操作系统和内核调用的一些内存地址

如图所示:

附加:

编译器的一个简单处理办法就是,设定一个固定地址(比如 0x10000)作为起始地址,开始存放代码,代码之后是数据,所有变量和函数的符号都在这个起始地址之后的某个固定偏移位置。假定程序每次运行都是位于一个不会变化的起始地址。

> 这里的变量指的是全局变量,其地址在编译链接后会确定不变。但局部变量是放在堆栈中的,会随着堆栈大小的动态变化而变化。
> 这里编译器产生的地址就是虚拟地址。

 在现代的操作系统中,当我们说到内存,往往需要分两部分来讲:物理内存和虚拟内存。从硬件上讲,虚拟空间是CPU内部的寻址空间,位于MMU之前,物理空间是总线上的寻址空间,是经过MMU转换之后的空间。

一般我们所说的程序在内存中的分布指的就是程序在虚拟内存中的存储方式。

从低地址到高地址,可分为下面几段: 
预留内存地址
(操作系统维护的内存地址,不可访问) 
程序代码区(只读,存代码和一些其他的东西); 
data段(存初始化的全局变量和static变量,另外还有文字常量区,常量字符串就是放在这里,程序结束后有系统释放); 
bss段(存未初始化的全局变量和static变量); 
(由低地址向高地址增长,一般new和malloc分配,由程序员分配释放);
共享库文件(调用的库文件,位于堆和栈之间);
 
(由高地址向低地址增长,和堆的增长方式相对,对不同的OS来说,栈的初始大小有规定,可以修改,目前默认一般为2M,由编译器自动分配释放); 
再上面存的都是操作系统和内核调用的一些内存地址

如图所示:

附加:

编译器的一个简单处理办法就是,设定一个固定地址(比如 0x10000)作为起始地址,开始存放代码,代码之后是数据,所有变量和函数的符号都在这个起始地址之后的某个固定偏移位置。假定程序每次运行都是位于一个不会变化的起始地址。

> 这里的变量指的是全局变量,其地址在编译链接后会确定不变。但局部变量是放在堆栈中的,会随着堆栈大小的动态变化而变化。
> 这里编译器产生的地址就是虚拟地址。

猜你喜欢

转载自blog.csdn.net/haiross/article/details/52277753
今日推荐