虚拟内存地址与物理内存地址
- 每个进程仿佛自己独享一片2N字节的内存,其中N是机器位数
- 页:一个内存页是一段固定大小的连续内存地址的总称,
具体到Linux中,典型的内存页大小为4096Byte(4K)。
进程级内存管理
- 内存排布
- Code:这是整个用户空间的最低地址部分,存放的是指令(也就是程序所编译成的可执行机器码)
- Data:这里存放的是初始化过的全局变量
- BSS:这里存放的是未初始化的全局变量
- Heap:堆,这是我们本文重点关注的地方,堆自低地址向高地址增长,后面要讲到的brk相关的系统调用就是从这里分配内存
- Mapping Area:这里是与mmap系统调用相关的区域。大多数实际的malloc实现会考虑通过mmap分配较大块的内存区域,本文不讨论这种情况。这个区域自高地址向低地址增长
- Stack:这是栈区域,自高地址向低地址增长