32位x86体系linux虚拟地址空间

来源:互联网 发布:c 网络通信 编辑:程序博客网 时间:2024/06/11 11:44
每个程序被运行起来以后,它将拥有自己独立的虚拟地址空间(Virtual Address Space),这个虚拟地址空间的大小由计算机的硬件平台而决定,具体由CPU的位数决定。硬件决定了地址空间的最大理论上限,即硬件的寻址空间的大小,例如,32位x86体系linux虚拟地址空间是4GB的虚拟空间大小,地址范围是0~2^32-1,即0x00000000~0xFFFFFFFF。

0X00000000开始的128MB空间是禁止访问的,C语言中指针指向NULL时,当对这个指向操作时都是非法的,指向的就是这一块区域。

.text这一块空间就是代码段,这一块除过要保存程序中的源码信息,还包括只读数据段的内容。

.data这就是数据段,保存的是程序中用到的变量(这一块指的是已初始化过的全局静态变量&全局变量、局部静态变量)。

.bss段存放的是未初始化的全局变量和局部静态变量或者是初始化值为0的变量,而且这些段未初始化的变量的初始值或者默认值都是0。

heap段是一块巨大的内存空间,常常占据整个虚拟地址空间的绝大部分,在这片空间里,程序可以请求一块连续内存,例如C语言中的malloc函数申请内存空间就是来自于堆空间,这块内存在程序主动释放之前都会一直保持有效。且空间大小是可变的。

stack,即栈,是一个特殊的容器,用户可以通过压栈(push)和弹栈(pop)按照先进后出的规则对栈进行操作,且压栈位置和弹栈位置都只能是栈顶(top/esp)位置,压栈使得栈增大,弹栈使栈减小。栈底到栈顶总是由高地址指向低地址。函数运行时由系统在栈上开辟空间,栈保存了一个函数调用所需要的“现场”信息,被定义为“栈帧”,其中一般包括函数的返回地址和参数、局部变量定、函数调用前后的“现场”信息。定义的变量未初始化时,默认值都是0xcc这样的奇怪的数,通过对一个变量值的访问就可以确定它是否初始化。

程序启动后,最先加载到内存中的不是代码段内容或者数据信息,而是环境变量命令行参数(int main(int argc,char*argv[],char*envp[]));所以这一信息在内存中也是必须要存放的。

内核空间是操作系统加载的位置,在计算机启动的时操作系统就加载到这一区域了。


原创粉丝点击