操作系统(32位)会为每个进程分配4G(2的32次方计算得到)的虚拟地址空间,由用户空间和内核空间两部分构成。虚拟内存是内存的一种管理方式,实现对于逻辑上对于内存容量的扩展,使用硬盘(文件)来模拟的内存空间。Windows系统下,用户空间和内核空间以2:2比例划分,Linux系统下用户空间和内核空间以3:1划分。内核空间所有进程共享,用户空间各自独立。 虚拟地址空间分布如下图所示: (***64位的操作为进程分配16G的虚拟地址空间***)
.text(代码段) | 可执行代码、只读变量、字符串常量 |
.data(数据段) | 已初始化且初值非0的全局变量和静态变量(全局和局部) |
.bss | 未初始化或初始值为0的全局变量和静态变量。如果变量都已初始化,则bss段被清零 |
heap(堆) | 动态申请的内存 |
共享库 | 程序运行时被动态加载到内存中使用(Linux下为.so文件,widow下为.DLL文件) |
stack(栈) | 程序运行时需要在这里做数据运算,存储临时数据(局部变量、局部只读变量、函数参数、返回地址等),开辟函数栈等。 Linux下,栈是高地址往低地址开辟的。对于函数栈来说,函数运行完毕就释放内存。 |
命令行参数 | 类似ps -eLf 中-eLf就是命令行参数,而ps是可执行程序。 |
环境变量 | linux下的PATH,HOME等的环境变量(子进程会继承父进程的环境变量) |
ZONE_DMA | 直接访问区,16M |
ZONE_NORMAL | 常用区,映射页目录表,892M |
ZONE_HIGHMEM | 高端内存区,大于1G的文件的映射 |