超标量处理器设计笔记(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 缺失过程使用软件来实现

相关推荐
chase。19 分钟前
【学习笔记】PointWorld:迈向通用机器人操控的3D世界模型
笔记·学习·机器人
星恒随风3 小时前
C++ STL 栈详解:stack 的使用、经典题目与简单模拟实现
开发语言·数据结构·c++·笔记·学习
谢白羽3 小时前
vllm源码剖析14-vLLM 分布式推理-专家并行EP
笔记·分布式·llm·论文·vllm
玖玥拾4 小时前
Unity 3D 笔记(十一)UI 框架进阶:栈弹窗交互、BasePanel 基类虚方法、DoTween 界面动画
笔记·3d·unity
FellAveal4 小时前
【Go语言入门学习笔记】Part13.结构体与接口
笔记·学习·golang
学计算机的计算基5 小时前
回溯算法下篇:四道经典题讲透约束剪枝、原地标记、预计算与状态压缩
java·笔记·算法
雷工笔记5 小时前
Ubuntu迁移记录
笔记·ubuntu
一只小菜鸡..5 小时前
Stanford CS144 学习笔记 (九):大师访谈与互联网的未来
笔记·学习
十月的皮皮5 小时前
STM32从零到量产开发:四路继电器工业控制模块开发实战笔记(小白视角)
c语言·笔记·stm32·stm32cubemx·hal库
疯狂打码的少年5 小时前
【软件工程】软件项目管理(人员/产品/过程/项目)
笔记·软件工程