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);