超标量处理器设计笔记(6)TLB缺失、替换、写入

TLB 设计

  • [加入 TLB 和 Cache](#加入 TLB 和 Cache)
    • [TLB 的设计](#TLB 的设计)
      • [TLB 缺失](#TLB 缺失)
        • [软件实现 Page Table Walk](#软件实现 Page Table Walk)
        • [硬件实现 Page Table Walk](#硬件实现 Page Table Walk)
        • 二者对比
      • [TLB 替换](#TLB 替换)
        • [香山的 TLB 替换策略](#香山的 TLB 替换策略)
      • [TLB 写入](#TLB 写入)
      • [对 TLB 的控制](#对 TLB 的控制)
        • [Arm 风格的 tlb 管理](#Arm 风格的 tlb 管理)
        • [MIPS 风格的 tlb 管理](#MIPS 风格的 tlb 管理)

加入 TLB 和 Cache

TLB 的设计

#问题

书中说:TLB 利用的是时间相关性,空间相关性没有明显的规律

揣测原因:

  • 跨 4KB 页的连续数据访问不多
  • Cache 的空间相关性是 cache line 之间,block 之间,block 之内

现代处理器经常采用二级 TLB

  • 第一级 TLB 采用哈佛结构,I-TLB 和 D-TLB
  • 第二级 TLB 采用全组连,指令和数据共用的方式
    TLB 只会修改 Dirty (Store 指令) 和 Use (访问过) 位

注:TLB 访问和 Cache 访问的区别

  • Cache 是组相联,TLB 是全相连,需要和所有项比较 Tag(所以 TLB 的大小小,否则访问延迟很大)
  • TLB 访问是索引 tag,找到对应的 PFN
  • Cache 访问是索引 index,拿出 Tag 去比对,再找到对应的数据

页面大小修改

如果采用 1MB 大小的页时,只需要比较 VA31:20作为 Tag 索引即可,VA19:0寻址页的内部

TLB 缺失

软件实现 Page Table Walk

发生 TLB 缺失时,将 TLB 缺失的虚拟地址保存到特殊寄存器中,产生 TLB 缺失类型异常。

异常处理程序利用虚拟地址去寻址物理内存的页表,如果再缺失,则报 page fault 异常

为了避免异常处理程序再出现 TLB 缺失时,会将该段程序放在不需要地址转换的区域(操作系统地址范围)

硬件实现 Page Table Walk

当发现 MMU 缺失时,MMU 利用 VA 去寻址物理内存的页表

二者对比

软件处理 TLB miss 时,需要将流水线中的全部指令清空,适合深度不深的处理器

如果 TLB 缺失

  • 所需要的 PTE 在页表中,TLB 缺失处理大概需要十几个周期
  • 发生 Page fault 时,TLB 缺失处理大概需要成百上千周期,和页面的替换算法、被替换的页面是否是 dirty ,此时软件和硬件差别不大

TLB 替换

随机替换算法:时钟计数器每拍+1,需要替换时则访问该计数器

香山的 TLB 替换策略

TLB 写入

页面从物理内存中替换到硬盘时,需要考虑其 dirty 位

该页面有以下几种情况

  • 不在 dcache 中,不在 tlb 中
    • 直接写回到硬盘即可
  • 在 dcache 中,不在 tlb 中
    • 需要核对 dcache 是否发生变化
  • 在 dcache 中, 在 tlb 中
    • 假定放入到 TLB 的 PTE 都需要被使用的,TLB 中记录的页不允许从物理内存里取出

这种设计大大降低 page fault 时替换难度

对 TLB 的控制

有时候出现下述情况,物理内存中页表的项被强制移出,但该页依然在 tlb 内

  • 当一个进程结束时,释放指令、数据、堆栈
    • 如果有 ASID,则可以将该进程对应内容在 tlb 内置为无效
    • 没有则把所有的 I-tlb 和 D-tlb 都置为无效
  • 当进程占用物理空间过大,会将不常使用的页写回硬盘中,这些页可以置为无效(比较少这么实现)
    • 将某个 VPN 对应的表现置为无效
Arm 风格的 tlb 管理

硬件来实现

管理 TLB 的控制寄存器(通常使用协处理器 CP15 来实现)

  • 将 TLB 中 VPN 匹配的 entry 项置为无效的控制寄存器,除了满足 VPN 相等,还需要
    • Global 位无效,需要 ASID 也相等
    • Global 位有效,不需要 ASID 比较
    • 图片
  • 将 TLB 中 ASID 匹配的所有表项置为无效的控制寄存器,但是 TLB 中 Global 位有效的表项不会受到影响
    • 当一个进程退出时,则把该 ASID 所有内容都置为无效
    • 图片
  • 将 TLB 中所有未锁定 (unlocked) 状态的表项 (entry) 置为无效,那些锁定 (locked) 状态的表项则不会受到影响。
    • 为了加快处理器中某些关键程序的执行时间, 可以 TLB 中的某些表项设为锁定状态, 这些内容将不会被替换掉, 这样保证了快速的地址转换。
MIPS 风格的 tlb 管理

TLB 缺失过程使用软件来实现

相关推荐
马可家的菠萝13 小时前
你收藏的资料,有多少真的被你第二次打开过?
笔记·知识管理·效率提升·个人知识库
小刘在重生~14 小时前
Java Lock 显式锁案例|ReentrantLock 解决多线程安全问题(超详细实战)
java·笔记·面试
职豚求职小程序14 小时前
中国人寿27秋招笔试[特殊字符]北森机考|备考攻略
笔记
江湖人称菠萝包14 小时前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter9-Qt Charts
笔记·qt·qt5
乐橙开放平台14 小时前
从「多套客户端」到一套开放能力:乐橙视频监控能力复盘
笔记·物联网·自动化·音视频·智能家居
山岚的运维笔记15 小时前
mysql 专业笔记 -- 第 36 章:MySQL 管理
运维·数据库·笔记·后端·mysql·oracle·dba
江湖人称菠萝包17 小时前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter10-Data Visualization
笔记·qt·qt5
需要82617 小时前
Arthas 一个命令排查线上问题
java·jvm·spring·spring cloud
老当益壮梁奶奶18 小时前
ARM汇编学习笔记(五):从按键轮询到 GIC 中断控制器(ARM Cortex-A7 )
arm开发·笔记·单片机·嵌入式硬件
既然如此,那就开摆18 小时前
2023_Kirillov_SAM_总结
笔记·学习·遥感