背景
众所周知,虚拟地址和物理地址的映射关系是页表(Page Table)这个数据结构由系统来维护的,但是处理器是如何利用这个页表来获取物理地址来读写的呢。内存管理单元(MMU, Memory Management Unit)就是处理器上的的一个负责这个事情的硬件组件。CPU把虚拟地址放送给MMU,MMU把虚拟地址转化为物理地址给内存总线上的地址总线。那么MMU里面发生了什么呢?
MMU如何转化虚拟地址到物理地址?
如何获取页表的
MMU通过寄存器CR3来获取当前进程的页表基址,
如何计算出来物理地址
通过虚拟地址可以推算出页框(Frame)的索引和偏移量(Offset)。
TLB(Translation Lookaside Buffer)怎么加速这个转化过程?
TLB是一个储存在MMU中的一个小缓存,MMU使用页表前会查询TLB,如果TLB命中(TLB hit),就直接返回物理地址。如果未命中(TLB miss)的话,MMU去页表查找同时结果会缓存到TLB。
TLB里面的条目包含虚拟页号(Virtual Page Number)和物理页框号(Physical Frame Number)加上额外的一下控制位。
TLB的容量有限,所以需要某种高效的替换策略记得哪一个映射要被替换掉。我们可以选择的策略有:
最近最少使用(LRU, Least Recently Used)
随机替换(Random Replacement)
查找过程中可能出现的错误
查找过程中发现页表不在内存中,可以通过查看控制位的存在位(Present Bit)来检查是否在内存中。
虚拟地址无效,就是无法在页表找到对应的物理地址。
尝试做一些非法操作比如尝试使用一个只可以读的物理地址来做写的操作,MMU会查看页表项(Page Table Entry)的读写控制项来检查合法性。
如果用户态程序试图访问一个 User/Supervisor Bit (U/S) 位为 0 的页面