3.1.3_4 两级页表
约 32 分钟
新困难:地址字段分对后,还要逐级算“页表项自身的物理地址”
32位虚拟地址、4 KiB页、二级页表字段 10位目录|10位页表|12位偏移,PDE/PTE各4 B。虚拟地址 0xCAFEBABE,页目录物理基址 0x100000;对应PDE给出二级页表页框 0x123,PTE给出数据页框 0x45A。求各字段、PDE/PTE地址和最终物理地址。
def translate(va,pd_base,pt_frame,data_frame):
pdi=(va>>22)&0x3FF; pti=(va>>12)&0x3FF; offset=va&0xFFF
pde_address=pd_base+pdi*4
pt_base=pt_frame<<12
pte_address=pt_base+pti*4
physical=(data_frame<<12)|offset
return pdi,pti,offset,pde_address,pte_address,physical
r=translate(0xCAFEBABE,0x100000,0x123,0x45A)
assert r==(0x32B,0x3EB,0xABE,0x100CAC,0x123FAC,0x45AABE)
assert (0xCAFEBABE>>12)==0xCAFEB and (0x45AABE&0xFFF)==0xABE
陪算:最低3个十六进制位给偏移 ABE。其上10位页表索引为 3EB,再上10位目录索引为 32B。PDE地址 0x100000+0x32B×4=0x100CAC;PDE中的页框123左移12位得二级表基址123000,PTE地址 123000+3EB×4=123FAC;最终页框45A拼原偏移得 0x45AABE。可把三个虚拟字段重新拼回原地址,作为切位复核。
依据:页大小2^12使偏移在映射前后保持不变;每级10位索引范围都是0~1023,恰好在4 KiB页中选择1024个4字节表项。逐级状态不变量是“当前基址为下一张表的物理页首地址”,读到最终PTE后才得到数据页框。
无TLB且页表不在Cache时,一次数据访问需两次页表内存访问加一次数据访问;计算时间随页表级数 O(L),工作空间 O(1)。错误反馈:VPN不是直接物理页框;索引乘表项大小4;页框号要左移12位;偏移不能参与查页表;PDE无效应缺页/异常,不能继续使用题给页框。
迁移答案:改用2 MiB大页时偏移变21位,目录项可直接给大页框并跳过末级页表;具体字段必须按架构题设重新切分,不能仍套10+10+12。
桥接:纯分页只检查页表项;下一课增加段界限,要求先过段号与段内偏移检查,再进入段内分页。
学完《3.1.3_4 两级页表》后,请独立复现本课的核心状态变化或计算过程。
登录 后可看答案
Practice
本课练习
先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。