前言
内容仅作记录,解答有参考,请谨慎参考
20.1
题目描述
分析及解答
当使用多级页表的方式进行虚拟地址转换时,仍然只需要一个寄存器即可,将寄存器的不同位存储不同的信息,例如将划分为3个部分,分别存储VPN和Offset,其中VPN又分为两部分分别存储页目录索引(PDI)和页表索引(PTI),用这样的方式,使用一个寄存器即可完查找。
20.2
题目描述
分析及解答
输入命令./paging-multilevel-translate.py -s 0 执行模拟程序:
以虚拟地址611C转化为物理地址的过程为例,分析每次查找的内存引用过程:
611C转化为二进制为:110 0001 0001 1100
由于一共分成了128页,每页有32项,所以VA的高10位为VPN,其中VPN的高5位为页目录索引,低5位为页表索引,最后的5位表示Offset
根据模拟程序我们知道页目录存储在页表108 (十进制)这一页:
首先找到页目录索引(PDI):11000(对应十进制24)
那么我们可以知道,页目录索引(PDI)为24:
从第108页数到第24个,可以得到:a1,对应二进制1010 0001
其中最高位为:valid(为1表示有效),后7位为PFN (对应十进制33)
这时可以知道我们需要查找的是第33页
找到页表索引(PTI):01000(对应十进制8)
那么我们需要的页帧(PFN)就在页表第33页的第8个:
可以得到PFN为:b5(对应二进制1011 0101)
其中最高位为:valid(为1表示有效),后7位为PFN (0110101)
将最后得到的PFN左移后加上Offset (11100)得到:11010111100(对应16进制0x6bc)
即最终得到的物理地址为0x6bc
以上就是每次查找的具体内存引用过程,其余的查找过程同理。
依次输入:
./paging-multilevel-translate.py -s 0 -c
./paging-multilevel-translate.py -s 1 -c
./paging-multilevel-translate.py -s 2 -c
查看模拟结果:
可以看到每次模拟程序的种子不同,页目录在页表中的位置也不相同,每次虚拟地址的转化结果与我们的分析一致。
20.3
题目描述
分析及解答
缓存是会将经常访问或者最近访问的内存保存到缓存中,由于页表或者多级页表请求内存的次数很多会被经常访问,所以会保存到缓存中,因此是会导致大量缓存命中的。
如果程序本身很少访问页表,TLB基本全部命中,那么页表的访问次数将会很少,也会出现缓存未命中的情况。