0%
x86 段页式内存管理和页表映射
1 逻辑地址到物理地址的转换
1.1 转换规则

- linux 内核的地址转换规则是:从逻辑地址到线性地址,再从线性地址通过页表映射转换为物理地址
- 从逻辑地址到线性地址的转换规则是:通过段选择器找到对应的段(比如数据段、代码段等),加上段内偏移量定位到线性地址。在 linux 系统中,段基址定义为 0,所以实际上,线性地址等于逻辑地址
- 从线性地址到物理地址的转换则是通过页表映射实现
1.2 进程隔离
- 两个不同的进程中,使用相同的逻辑地址,可以访问到不同的物理地址。这是因为不同的进程可以对应不同的页目录表,从而最终定位到的物理地址也就不同
2 多级页表(以两级为例)

2.1 线性地址的划分
- 在 32 位系统中,线性地址为 32 位,被划分成 3 段,分别是:页目录表索引(10位)、页表索引(10位)、页内偏移量(12位),以此为例,实际情况可能不一样
2.2 定位页目录表
2.3 定位页表
- 根据公式:页目录表的起始地址 + 页目录表项索引 * 4B 得到某个页目录表项,其中存放着页表的起始地址(这里 4B 是一个页目录表项的大小,视具体情况而定)
2.4 定位物理地址
- 根据公式:页表基址 + 页表项索引 * 4B 得到某个页表项,其中存放着物理地址的基址(这里 4B 是一个页表项的大小,视具体情况而定)
- 根据公式:物理地址基址 + 页内偏移量,从而得到逻辑地址对应的实际物理地址