浅显易懂的讲解MMU是如何使用4级页表把虚拟地址转化为物理地址的~

用一个简单的比喻解释MMU使用4级页表转换虚拟地址的过程。

🌟 核心比喻:图书馆找书系统

想象一个巨大的图书馆(内存),有4层楼:

  1. 区域楼层索引(PML4)
  2. 书架区索引(PDPT)
  3. 书架排索引(PD)
  4. 具体书架索引(PT)
  5. 书在书架上的位置(偏移)

📝 地址结构(以x86_64为例)

一个48位虚拟地址(如 0x123456789ABC)被这样分割:

复制代码
| 9位 | 9位  | 9位  | 9位  | 12位    |
| PML4| PDPT | PD   | PT   | 偏移量  |

就像:区域号.书架区.排号.书架号.书的位置

🔄 转换步骤(5步走)

第1步:起点

MMU查看CR3寄存器(就像图书馆总目录柜的编号),找到PML4表的物理位置。

第2步:查第1级表(PML4表)

用地址的前9位作为索引,在PML4表中找到对应的条目,这个条目告诉你第2级表(PDPT) 在哪。

复制代码
虚拟地址前9位 → 在PML4表中找 → 得到PDPT表的物理地址

第3步:查第2级表(PDPT表)

用接下来的9位作为索引,在PDPT表中找到对应的条目,这个条目告诉你第3级表(PD) 在哪。

第4步:查第3级表(PD表)

再用接下来的9位作为索引,在PD表中找到对应的条目,这个条目告诉你第4级表(PT) 在哪。

第5步:查第4级表(PT表)

用再接下来的9位作为索引,在PT表中找到对应的条目,这个条目终于告诉你物理页框的起始地址。

第6步:组合最终地址

将物理页框起始地址 + 最后12位的偏移量 = 最终的物理地址!

🎯 举个具体例子

假设虚拟地址是:0x0000 7FFF FFFF F000

(这是一个合法的用户空间地址)

  1. 分解:
    · PML4索引:0x0FF
    · PDPT索引:0x1FF
    · PD索引:0x1FF
    · PT索引:0x1FF
    · 偏移量:0x000

  2. 查找过程:

    复制代码
    CR3 → PML4表 → 条目[0x0FF] → PDPT表地址
    PDPT表地址 → 条目[0x1FF] → PD表地址  
    PD表地址 → 条目[0x1FF] → PT表地址
    PT表地址 → 条目[0x1FF] → 物理页框地址
    物理页框地址 + 0x000 → 最终物理地址

💡 为什么用4级页表?

优点 解释

节省内存 只为实际使用的地址空间创建页表项

灵活映射 不同进程有独立的地址空间

支持大页 可以在某一级直接映射大页面(2MB或1GB)

权限控制 每级都可以设置读写权限

🚀 加速技巧:TLB

因为每次都查4个表太慢了,CPU有个TLB缓存(快表),保存最近查过的地址映射,就像图书馆的"最近借阅记录"。

命中TLB:1-2个时钟周期完成转换

未命中:需要查4个表,大约10-20个时钟周期

📊 对比:32位系统的2级页表

复制代码
32位: 10位 + 10位 + 12位
      PD索引  PT索引  偏移量

64位系统用4级(或5级)是因为地址空间太大了:

· 32位:4GB地址空间

· 64位:256TB地址空间(48位)或128PB(57位)

🎨 可视化流程

复制代码
虚拟地址
    ↓
[ PML4索引 ] → 查PML4表 → 得到PDPT地址
    ↓
[ PDPT索引 ] → 查PDPT表 → 得到PD地址
    ↓  
[ PD索引 ] → 查PD表 → 得到PT地址
    ↓
[ PT索引 ] → 查PT表 → 得到物理页框地址
    ↓
+ [12位偏移量]
    ↓
物理地址 ✅

就像从"中国.北京.海淀区.中关村.大街27号"这样一级级找到具体位置一样!

这就是MMU把"虚拟地址"翻译成"物理地址"的完整过程~

相关推荐
神の愛4 小时前
左连接查询数据 left join
java·服务器·前端
t***5444 小时前
如何配置Orwell Dev-C++使用Clang
开发语言·c++
CoderCodingNo4 小时前
【信奥业余科普】C++ 的奇妙之旅 | 13:为什么 0.1+0.2≠0.3?——解密“爆int”溢出与浮点数精度的底层原理
开发语言·c++
九皇叔叔4 小时前
Ubuntu 22.04 版本常用设置
linux·运维·ubuntu
南境十里·墨染春水4 小时前
linux学习进展 线程同步——互斥锁
java·linux·学习
kongba0075 小时前
项目打包 Python Flask 项目发布与打包专家 提示词V1.0
开发语言·python·flask
froginwe116 小时前
C 语言测验
开发语言
杨云龙UP6 小时前
ODA登录ODA Web管理界面时提示Password Expired的处理方法_20260423
linux·运维·服务器·数据库·oracle
今夕资源网6 小时前
powershell工具包 安装升级脚本并设置UTF-8 环境快捷方式创建 将powershell的编码默认改为UTF-8
开发语言·utf-8·powershell·utf-8编码·powershell7·powershell5·设置utf-8编码
郑寿昌6 小时前
IIoT本体迁移的领域扩展机制
服务器·前端·microsoft