隔了两天再更新。。。周四下班太晚。周五出去吃夜宵回来太晚。。。
1.虚拟地址的基本概念
为什么需要虚拟地址?
虚拟地址:开启MMU之后,程序运行访问某个虚拟地址时,在CPU内部MMU会转换成物理地址,然后在通过CPU管脚发出去。对于DDR来说,不关心程序发出的地址,只认识CPU管脚的地址。---感觉这里没说清楚。
物理地址:相对于CPU管脚来说,发出去的地址称为物理地址。
线性地址、逻辑地址:x86上的概念
总线地址:挂载总线上的每个设备都会给他一个编址,构成不同的地址域。
MMU作用:将虚拟地址转换成物理地址
下面是一个load/store的过程:
注:现代处理器cache基本上采用了pipt的方式。因此MMU单元返回物理地址后,首先是去cache找到对应内存地址的数据。
2.MMU工作原理
虚拟页号、物理页号:MMU的转换也是以页为单位进行转换。所以MMU就是负责将程序的虚拟地址映射到物理内存中的实际物理地址。
MMU的工作原理就是将上述几个专用名称组合在一起。当 CPU 访问内存时,MMU 会根据虚拟地址进行以下步骤的地址转换:提取页号:从虚拟地址中提取页号(Page Number)。查找页表项:使用页号作为索引,在页表中查找对应的页表项。获取物理地址:从页表项中获取物理地址,并与虚拟地址中的偏移量(Offset)组合成完整的物理地址。
页表:MMU的转换需要一个转换表,表里保存虚拟页号和物理页号的关系。在进行转换的时候,MMU中的table walk unit单元去内存中查看翻译表(存放在物理内存上的一段数据),
MMU使能:通过协处理器命令访问修改寄存器
TLBs:其实就是一段翻译表的缓存
缺页处理:如果 MMU 发现请求访问的页面不在物理内存中(即发生了缺页中断),它会暂停当前的操作并将控制权交给操作系统。操作系统会负责将缺失的页面从磁盘换入物理内存,并更新页表。之后,MMU 会恢复之前的指令执行。
注意:对于cache和memory,它只认识物理地址,不认识虚拟地址。其实也很好理解,假设CPU发出一个load指令,第一时间让MMU找到对应的物理地址(去自己的缓存tlb中查找有没有对应的物理地址,或者自己通过table walk unit单元去翻译,反正MMU单元负责把物理地址搞过来就行),第二时间:将得到的物理单元去cache找数据,没有的话就去内存中找。
3.虚拟地址到物理地址的转换原理
0-11位作为偏移,虚拟页号到物理页号做一个转换即可。例如0x80003160的低12位0x160作为偏移,(查找page table后)再通过虚拟页帧号找到物理页帧号。(例子中0x80003 -> 0x60003,再讲物理页帧号和偏移凑在一起得到物理地址)。
基本原理的关键就在于页表,假设32位地址,去掉12位偏移,剩下20位都作为页帧号的话,此时需要2^20次方个映射条目,最少需要4M个条目(这个page table保存在内存上),每个进程都维护这样的页表会很浪费内存。因此需要引入多级页表。(底下这个图有点问题的,VPN是不放在page table中的,它只是根据vpn当作整个page table的偏移,例如这里的0x80003就代表是page table的0x80003项entry保存了它的物理地址)