TLB:
- TLB 即 Translation Lookaside Buffer ,根据功能可以译为快表,直译可以翻译为旁路转换缓冲,也可以把它理解成页表缓冲。
- 其中每一行都保存着一个由单个PTE(Page Table Entry,页表项)组成的块。
- TLB里面存放的是一些页表文件(虚拟地址到物理地址的转换表),如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据。
- TLB 是一个阵列结构,是为虚拟地址 (VA) 到物理地址 (PA) 转换的硬件机构,其为虚拟存储的硬件基础。
- 快表是单独的寄存器,页表是存在于主存。
TLB结构:
VPN2 | 虚页框号 | 始终为偶数 |
ASID | 证某 TLB 项仅供某进程使用 处理器检索 TLB 时,会以CPU0->Entry_Hi->ASID[7:0] 域为当前进程的 ASID 与 TLB 项中的相比较 | |
PageMaks | 页掩码 | 为支持可变页大小而设 |
PFN | 物理页框号 | =VPN2 |
FLags VDC | 物理页属性 | 每个物理页,还有一些控制 Flags V: Valid,1 位,置 1 说明该页是有效的。 |
G | Globle 位 如置该位为 1 ,则说明该 TLB 项是全局的,可供任何进程使用,TLB 检索时处理器将忽略 ASID 的检查。 | |
PFN | 物理页框号 | =VPN2+1 |
Flags VDC | 物理页属性 | 每个物理页,还有一些控制 Flags V: Valid,1 位,置 1 说明该页是有效的。 |
工作方式:
- 处理器取虚址的高位作 VPN ,直接将其与 TLB 的所有项同时比较
- 有匹配的项且该项有效 (V 为 1) 则直接输出 PFN ,
- 否则抛出 TLB Refill 异常,后则由 OS 负责在该异常处理里将位于内存的页表读出,并以随机方式写入 TLB,
- 尔后异常返回,重新执行一次访存指令,因此会重走一次 TLB。
相关的CPU0寄存器
- EntryHi 寄存器
- EntryLo0寄存器
- EntryLo1寄存器
- PageMask寄存器
- Index寄存器
- Random寄存器
- Wired寄存器
- Contex寄存器
相关指令:
tlbr | TLB 读指令 | 直接读取 Index 所指示的 TLB 项,并将其内容分别 置入 PageMask,EntryHi,EntryLo0 和 EntryLo1 |
tlbwi/tlbwr | 索引方式写 TLB/随机方式写 TLB | 输入的 TLB 数据,亦置于EntryHi,EntryLo0 和 EntryLo1。入口项由 Index 寄存器/Random 寄存器指定。 |
tlbp | TLB 查询指令 | 以 EntryHi[VPN2] 检索整个 TLB ,有匹配的项则继续检查该项之 ASID 是否与 EntryHi[ASID] 相等,若满足,则将该项的索引值(标号)写入 Index 。若无满足条件 的项,则将 Index 的 31 位置为 1 |