问题
下图中真题(第三小问的“需要读TLB多少次”)的答案是查TLB不命中后会再查一次TLB(红色字体是王道的解析),而王道书里给出的地址变换流程图没有这个再查一次TLB的步骤。这要以哪个为准呢。
其实我一开始的理解是,先查一次TLB,不命中且页表也不命中后,发生缺页中断,之后会将该页写入页表和TLB,因此才有的“本次访问会访问两次TLB”,一次是读、一次是写。
但是真题的意思又是“需要读TLB两次”,所以我就很懵了[晕]
解答
一个只是高速缓存不命中,一个是中断,二者的级别都不一样。
TLB、页表都不命中导致发生缺页中断时,中断处理完成后,应理解为重新执行这条引起中断的指令。因此会重新从越界处理、查TLB开始。也就有了真题当中的“读两次TLB”的说法。
至于我类比的Cache不命中,应该对标的其实是“TLB不命中、页表命中”,即该页是在内存中的,只不过其虚拟地址和物理地址的对应关系没有记录在TLB中。这种情况下,查TLB不命中后会查页表,页表命中,然后写入TLB,接着就正常执行了。不会出现读两次TLB的情况。
对于王道书中给出的流程图也并不通用,不同的OS的策略也不同,不能以这个为准,以上面对真题的解读为准。