图解 Linux 内存管理 -- 线性空间与物理内存
来源:互联网 发布:java环境产量配置 编辑:程序博客网 时间:2024/05/17 03:48
上图反映了如下信息:
1、进程的4G 线性空间被划分成三个部分:进程空间(0-3G)、内核直接映射空间(3G – high_memory)、内核动态映射空间(VMALLOC_START - VMALLOC_END)
2、三个空间使用同一张页目录表,通过 CR3 可找到此页目录表。但不同的空间在页目录表中页对应不同的项,因此互相不冲突
3、内核初始化以后,根据实际物理内存的大小,计算出 high_memory、VMALLOC_START、VMALLOC_END 的值。并为“内核直接映射”空间建立好映射关系,所有的物理内存都可以通过此空间进行访问。
4、“进程空间”和“内核动态映射空间”的映射关系是动态建立的(通过缺页异常)
假设在有三个线性地址 addr1, addr2, addr3 ,分别属于三个线性空间,但是最终都映射到物理页面1:
1、三个地址对应不同的页表和页表项
2、但是页表项的高 20bit 肯定是1,表示物理页面的索引号是1
3、同时,根据高 20 bit,可以从 mem_map[] 中找到对应的 struct page 结构,struct page 用于管理实际的物理页面(红线)
4、从线性地址,根据页目录表,页表,可以找到物理地址
5、Struct page 和物理地址之间很容易互相转换
6、从物理地址,可以很容易的反推出在内核直接映射空间的线性地址(蓝线)。要想得到在进程空间或者内核动态映射空间的对应的线性地址,则需要遍历相应的“虚存区间”链表。
关于页目录表:
1、每个进程有一个属于自己的页目录表,可通过 CR3 寄存器找到2、而内核也有一个独立于其它进程的页目录表,保存在 swapper_pg_dir[] 数组中
3、当进程切换的时候,只需要将新进程的页目录把地址加载到 CR3 寄存器中即可
4、创建一个新进程的时候,需要为它分配一个 page,作为页目录表,并将 swapper_pg_dir[] 的高 256 项拷贝过来,低 768 项则清0
- 图解 Linux 内存管理 -- 线性空间与物理内存
- 图解 Linux 内存管理 -- 线性空间与物理内存
- 图解 Linux 内存管理 -- 线性空间与物理内存
- Linux 内存管理 -- 线性空间与物理内存
- Linux 内存管理 -- 线性空间与物理内存
- Linux 内存管理 -- 线性空间与物理内存
- 线性空间与物理内存
- Linux内存管理图解(逻辑-线性-物理)
- 物理内存和线性空间
- Linux内存管理图解
- Linux内存管理图解
- Linux内存管理图解
- Linux内存管理图解
- Linux内存管理图解
- 物理内存和线性空间(虚拟内存)
- Linux内存管理图解(1)逻辑地址转线性地址
- Linux内存管理图解(2)线性地址转物理地址
- Linux内存管理-浅谈物理内存与虚拟内存
- svn客户端连接协议
- Wince 6.0 教程---第四课 XIP与HIVE
- 使用Pull解析器读取XML文件和生成XML文件
- Webkit之网络模块
- Wince 6.0 教程---第五课.更改任意文件夹路径
- 图解 Linux 内存管理 -- 线性空间与物理内存
- Android 各版本代号 & Java Source Download
- A different object with the same identifier value was already associated with the session错误解决方法
- Jquery EasyUi dateGrid 自适应浏览器宽度
- 继续求大offer
- WinCE中BSP的Clone
- Android应用程序四大组件之Activity入门
- WINCE 任务栏的显示隐藏
- Android Intent.ACTION_CHOOSER 与 Intent.ACTION_PICK_ACTIVITY