学习二级页表总是弄不清楚逻辑地址结构和物理内存存储的内容的细节,本篇文章便是我自己的一点困惑和解答。
页面大小 4KB,页表项4B,逻辑地址32位,按字节编址。
补充:
条件:32位逻辑地址空间、页面大小4KB、页表项大小4B,以字节为编址单位
页面大小为4KB,页内偏移地址为log24K= 12位,页号部分为20位,若不采用分级页表,则仅一个页表就要占用20x4B/4KB=1024页=4MB。
页表项仅用于存储该页号所对应的物理块号,所以4B恰好对应这32位逻辑空间,需要用32bit存储这32位地址空间
输入:32位虚拟地址 0x01234567
输出:32位的实际物理地址
二级页表地址拆分规则:高10位为页目录(二级)索引,中间10位为(一级)页表索引。最后低12位为物理页(实际物理地址)内偏移量。
举例说明:输入虚拟地址 0x01234567 对其拆分二进制,我们知道十六进制到二进制是1对4位的关系,即0x0 =0000 ,0x1=0001 ,0x2=0010 ,
所以拆分得到
0000 0001 00 = 2 D
10 0011 0100 = 564 D
0101 0110 0111 = 567 H
这样分别得到页目录(二级页表)的索引值是4,页表(一级页表)的索引值是564,物理内偏移量是567H.
第一步:要去页目录(二级)中找到页表(一级)地址,也就是4*4=16,意味着该页表地址偏离页目录首地址16个字节处。从这里取出页表(一级)地址。
第二步:要去页表(一级)中找实际的物理页地址。偏移量是564*4=2256=0x8d0,加上第一步找到的页表首地址。最后就得出了实际的物理页地址。
第三步:将物理页地址加上原虚拟地址低12的偏移量,得到最终的实际物理地址。这个地址就是最后输出的结果,用它去访问内存取到数据。