Linux的内存模型,一般为:
地址 | 作用 | 说明 |
>=0xc000 0000 | 内核虚拟存储器 | 用户代码不可见区域 |
<0xc000 0000 | Stack(用户栈) | ESP指向栈顶 |
| ↓
↑ |
空闲内存 |
>=0x4000 0000 | 文件映射区 |
|
<0x4000 0000 |
↑ |
空闲内存
|
| Heap(运行时堆) | 通过brk/sbrk系统调用扩大堆,向上增长。 |
| .data、.bss(读写段) | 从可执行文件中加载 |
>=0x0804 8000 | .init、.text、.rodata(只读段) | 从可执行文件中加载 |
<0x0804 8000 | 保留区域 |
|
在glibc实现的内存管理算法中,Malloc小块内存是在小于0x4000 0000的内存中分配的,通过brk/sbrk不断向上扩展,而分配大块内存,malloc直接通过系统调用mmap实现,分配得到的地址在文件映射区,所以其地址大于0x4000 0000。
全局内存的说明,bss、data和rodata:
bss是指那些没有初始化的和初始化为0的全局变量:bss类型的全局变量只占运行时的内存空间,而不占文件空间。
data里面存放着数据。当然,如果数据全是零,为了优化考虑,编译器把它当作bss处理:data类型的全局变量是即占文件空间,又占用运行时内存空间的。
rodataro代表read only,即只读数据(const)