超标量处理器设计笔记(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 大小的页时,只需要比较 VA[31:20]作为 Tag 索引即可,VA[19: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 缺失过程使用软件来实现

相关推荐
2401_884810741 小时前
MySQL视图笔记
数据库·笔记·mysql
扶离_flee1 小时前
麦田物语学习笔记:背包物品选择高亮显示和动画
笔记·学习
葡萄架子2 小时前
线程安全问题介绍
java·jvm·安全
Daniel_1873 小时前
Promise-课堂笔记
前端·javascript·笔记
大邳草民3 小时前
iOS 概述
笔记·ios
东阳马生架构4 小时前
G1原理—6.G1垃圾回收过程之Full GC
jvm
不错就是对5 小时前
韩顺平老师Linux学习笔记【持续更新...】
大数据·linux·运维·笔记·深度学习·学习
纪伊路上盛名在7 小时前
高级生化大纲
笔记·学习·学习方法
KhalilRuan8 小时前
UnityDemo-TheBrave-制作笔记
笔记
️Carrie️9 小时前
4.3.3 最优二叉树+二叉查找树
数据结构·笔记·算法