C++——虚拟地址空间区域划分

张开发
2026/4/21 0:03:00 15 分钟阅读

分享文章

C++——虚拟地址空间区域划分
一.什么是虚拟地址空间对于任何一个计算机程序来说其在内存中运行时主要由指令与数据组成对于任意一个编程语言再编译链接后都会生成可执行文件如windows下的.exe文件这一可执行文件通常放在磁盘上而在程序无法在磁盘上直接运行实际运行时要先加载到内存中但并不会加载到物理内存中而是虚拟内存操作系统会为这个进程创建一个独立的虚拟地址空间。二.虚拟地址空间区域划分32位Linuxh环境首先Linux操作系统会为此进程开辟2^32比特位(4G)大小的空间称为进程的虚拟地址空间(是虚拟内存空间并不在内存上虚拟内存实际上是使用磁盘来扩大物理内存)如图为虚拟地址空间区域划分。默认情况下Linux为用户空间分配3G为内核空间分配1G。从低地址向高地址看从0x00000000,到0x08048000为无法访问的空间通常称为空指针保护区或保留区,是为了防止程序崩溃而设置的例如空指针地址就是0x00000000。接着是.text代码段用于存放指令紧邻着的是.rodata只读数据段(存放常量字符串const 修饰的全局变量和静态变量)这两者都是只读的。.data段与.bss段其中.data段存放已经初始化的值不为0的静态局部或全局变量。.bss段存放未初始化的或初始化为0的静态局部或全局变量。.haep堆区只在使用new等操作动态开辟内存时分配。加载共享库程序在运行时用来存放动态链接的库也就是 Windows 下的 .dll 或 Linux 下的 .so 文件的区域。.stack栈区主要存放于函数相关的内容如函数内的局部变量参数返回值等命令行参数与环境变量命令行参数是你在启动程序时紧跟在命令后面输入的附加信息。它用来告诉程序“这次具体要做什么”环境变量是操作系统中用来指定运行环境的全局性参数内核空间ZONE_DMA用于早期 ISA 设备的直接内存访问通常位于物理内存的最开始部分前 16MB。ZONE_NORMAL普通内存区内核可以直接寻址的物理内存通常是 16MB 到 896MB。ZONE_HIGHMEM高端内存区。当物理内存很大例如超过 1GB时内核空间无法直接一对一映射所有物理内存这部分内存被称为高端内存需要动态映射才能访问。三.具体实例分析对于这段代码其中gdata1,gdata4为初始化且值不为0的全局变量存放在.data上gdata2,gdata5,初始化了但值为0gdata3,gdata6未初始化,存放在.bss上e,f,g同理e在.data上f,g在.bss上其中int a10,int b0,int c; a,b,c这三行代码经过编译产生了三条指令存放在.text上但在函数调用时a,b,c在栈上。四.每一个进程用户空间是私有的内核空间是公有的匿名管道通讯的原理就是借助内核空间是公有的。

更多文章