• TLB、页表不命中后发生了什么


    问题

    下图中真题(第三小问的“需要读TLB多少次”)的答案是查TLB不命中后会再查一次TLB(红色字体是王道的解析),而王道书里给出的地址变换流程图没有这个再查一次TLB的步骤。这要以哪个为准呢。
    其实我一开始的理解是,先查一次TLB,不命中且页表也不命中后,发生缺页中断,之后会将该页写入页表和TLB,因此才有的“本次访问会访问两次TLB”,一次是读、一次是写。
    但是真题的意思又是“需要读TLB两次”,所以我就很懵了[晕]

    请添加图片描述
    请添加图片描述

    解答

    一个只是高速缓存不命中,一个是中断,二者的级别都不一样。

    TLB、页表都不命中导致发生缺页中断时,中断处理完成后,应理解为重新执行这条引起中断的指令。因此会重新从越界处理、查TLB开始。也就有了真题当中的“读两次TLB”的说法。

    袁书:“如果在执行lw/sw指令时发生缺页异常,则说明需要读写的数据所在的页面不在主存,需要操作系统内核程序进行相应处理,以便将所需页面调入内存,缺页处理结束后,显然应该回到发生缺页的指令重新执行一遍,因而其断点值应该是当前PC值-‘1’,即PC必须减‘1’才能保证缺页异常处理返回后重新执行lw/sw指令”

    至于我类比的Cache不命中,应该对标的其实是“TLB不命中、页表命中”,即该页是在内存中的,只不过其虚拟地址和物理地址的对应关系没有记录在TLB中。这种情况下,查TLB不命中后会查页表,页表命中,然后写入TLB,接着就正常执行了。不会出现读两次TLB的情况。

    对于王道书中给出的流程图也并不通用,不同的OS的策略也不同,不能以这个为准,以上面对真题的解读为准。

  • 相关阅读:
    Scala面向对象部分演示(IDEA开发)
    ansible部署二进制k8s
    Python中将列表拆分为大小为N的块
    Ubuntu18.04开机自动启动终端并运行脚本
    腾讯视频云流媒体技术探索
    爱普生相机SD卡格式化后数据恢复指南
    [CISCN2019 华北赛区 Day1 Web1]Dropbox 1
    yaml中的指示符和注释符使用
    C语言学习笔记day2
    详解PHP解决swoole守护进程Redis假死 ,mysql断线重连问题
  • 原文地址:https://blog.csdn.net/qq_43527718/article/details/133752801