TLB


1. TLB由来

  • 这篇博客中有简单介绍。
  • MMU根据页表,将虚拟地址映射得到对应的物理地址。
    • 页表在64bit系统中,常见为3-5级,以4级为例,分别有PGD\PUD\PMD\PTE四级页表。
    • 硬件上有一个页表基地址寄存器,存放着PGD页表的首地址;之后根据虚拟地址中PGD index查找到对应的PUD页表的首地址,依次类推,最后找到PTE中存放的物理地址。示意图在这篇文章中,结合看更清晰。
  • 上面所描述的查找过程十分费时,影响性能,考虑加一块缓存,提高速度。于是就出现了TLB。
    • TLB本质上是一块高速缓存,在虚拟地址到物理地址转换时,首先查找TLB,是否命中,如果命中直接得到物理地址。如果未命中,仍需要一级一级查找页表获取物理地址,并需要将虚拟地址和物理地址的映射关系缓存到TLB中。

2. TLB 的歧义&别名

  • 由于TLB用途就是根据虚拟地址查找cache,所以TLB必定是VIVT。这篇博客中有介绍VIVT存在歧义和别名的问题。

2.1 TLB 特殊处理

  • TLB 有些不同于前面学习的Cache,在这篇博客中,可以看到虚拟地址映射单位为Page,一般Page大小取4KB,所以TLB不需要存储虚拟地址的低12bit,在最后得到PPN的值后直接拼接低12bits即可。
  • 另外,命中cache之后,cache line中的数据即page index,所以都会被取出,不需要offset域。
  • index域是否存在取决于是否为全相联缓存。

2.2 别名

  • VIVT 数据Cache出现别名的主要原因在这篇博客。根本在于存在一个修改地址-数据映射关系,且未被同步。
  • TLB虽然是VIVT,但是由于其不存在修改虚拟地址-物理地址映射关系,那么就不会出现别名情况。

2.3 歧义

  • VIVT 出现歧义的主要原因在于不同进程中,相同虚拟地址可能对应着不同的物理地址。
  • 解决方法:与VIVT 数据Cache 相同,采用切换进程时flush TLB,将整个TLB置为无效;但会导致性能损失。

2.4 如何尽量避免flush TLB

  • 前面介绍,TLB存在歧义问题主要是不同进程的相同虚拟地址对应不同物理地址,那么如果可以区分不同进程的TLB表项就可以避免flush TLB。
  • 上面的想法可以通过每行cache line扩展几bit作为分辨进程ID(ASID:Address Space ID),在判断TLB是否命中时,除了比较tag,还需要比较ASID,选择当前进程匹配的ASID的cacheline进行操作。
  • ASID的管理
    • 需要注意:ASID和进程ID并不是一个,进程ID取值范围很大,但ASID一般为8/16bit,只能区分256/65536个进程。所以ASID和进程ID不可能一一对应。
    • 每创建一个新进程时,就会为之分配一个ASID,当所有的ASID都分配完了,就会flush TLB,之后重新分配。
    • ASID一方面需要放在TLB Cache line中,另一方面可以将其放在前面介绍的页表基地址寄存器中拓展若干bit;在查TLB是否命中时,比较tag,以及这两部分的ASID是否相等。
posted @ 2023-08-09 19:42  可达达鸭  阅读(124)  评论(0编辑  收藏  举报