LINUX内存映射问题
来源:百度知道 编辑:UC知道 时间:2024/05/15 02:31:30
要得到用户虚拟地址所对应的物理地址该怎么办呢?内存映射的原理是怎么样的?
Linux的内存模型,一般为:
地址
作用
说明
>=0xc000 0000
内核虚拟存储器
用户代码不可见区域
<0xc000 0000
Stack(用户栈)
ESP指向栈顶
↓
↑
空闲内存
>=0x4000 0000
文件映射区
<0x4000 0000
↑
空闲内存
Heap(运行时堆)
通过brk/sbrk系统调用扩大堆,向上增长。
.data、.bss(读写段)
从可执行文件中加载
>=0x0804 8000(0x00008000 for arm linux)
.init、.text、.rodata(只读段)
从可执行文件中加载
<0x0804 8000(0x00008000 for arm linux)
保留区域
运行一个测试程序,观察其结果:
#include <stdio.h>
int main(int argc, char* argv[])
{
int first = 0;
int* p0 = malloc(1024);
int* p1 = malloc(1024 * 1024);
int* p2 = malloc(512 * 1024 * 1024 );
int* p3 = malloc(1024 * 1024 * 1024 );
printf("main=%p print=%p\n", main, printf);