图例
确定页目录基址
每个CPU都有一个页目录基址寄存器,在x86上,这个寄存器是cr3
每次计算物理地址时,mmu都会从cr3寄存器中取出页目录所在的物理地址
定位页目录项(PDE)
一个32位的虚拟地址可以拆成10位,10位和12位3段,上一步找到页目录表基址加上高10位的值乘以4,就是页目录项的位置
一个页目录项正好是 4 字节,所以 1024 个页目录项共占据 4096 字节,刚好组成一页,而 1024 个页目录项需要 10 位进行编码
定位页表项(PTE)
页目录项记录着页表的位置,CPU通过页目录找到页表的位置以后,再用中间10位计算页表中的偏移,可以找到该虚拟地址锁对应的页表项
页表项也是 4 字节的,所以一页之内刚好也是 1024 项,用 10 位进行编码
所以计算公式与上一步相似,用页表基址加上中间 10 位乘以 4,可以得到页表项的地址
确定真实的物理地址
上一步 CPU 已经找到页表项了,这里存储着物理地址,这才真正找到该虚拟地址所对应的物理页
虚拟地址的低 12 位,刚好可以对一页内的所有字节进行编码,所以我们用低 12 位来代表页内偏移
计算的公式是物理页的地址直接加上低 12 位