输入:32位虚拟地址 0x01234567
输出:32位的实际物理地址
二级页表地址拆分规则:高10位为页目录(二级)索引,中间10位为(一级)页表索引。最后低12位为物理页(实际物理地址)内偏移量。
举例说明:输入虚拟地址 0x01234567 对其拆分二进制,我们知道十六进制到二进制是1对4位的关系,即0x0 =0000 ,0x1=0001 ,0x2=0010 ,
所以拆分得到 0000 0001 0010 0011 0100 0101 0110 0111
这样分别得到页目录(二级页表)的索引值是4,页表(一级页表)的索引值是564,物理内偏移量是0x567.
第一步:要去页目录(二级)中找到页表(一级)地址,也就是4*4=16,意味着该页表地址偏离页目录首地址16个字节处。从这里取出页表(一级)地址。
第二步:要去页表(一级)中找实际的物理页地址。偏移量是564*4=2256=0x8d0,加上第一步找到的页表首地址。最后就得出了实际的物理页地址。
第三步:将物理页地址加上原虚拟地址低12的偏移量,得到最终的实际物理地址。这个地址就是最后输出的结果,用它去访问内存取到数据。
总结一下:物理页地址存放在(一级)页表中,(一级)页表地址存放在页目录(二级)中,页目录首地址(二级)有专门的寄存器存储它。