tlb

什么是tlb

  • cache是对内存数据的缓存;
  • tlb是对mmu地址转换结果的缓存;

tlb基础知识

  • tlb entry主要包含:vpn->pfn,一些属性
  • 采用组相连;
  • tlb也分l1 tlb,l2 tlb;
    • l1 tlb分指令tlb和数据tlb;
    • l2 tlb是统一的tlb;

tlb重名同名问题;

tlb只能使用VIVT;

重名:

重名同一个物理地址映射到了不同的虚拟地址;
但是由于tlb存放的是vpn和pfn的转化关系,所以就算在不同的tlb,都存放的是相同的结果;
所以不存在重名问题;

同名:

就是同一个虚拟地址映射到了不同的物理地址;存在同名问题;
解决办法就是:进程切换时,使旧进程遗留下来的tlb失效;
但是这种方法性能不太好,增加ASID区分;

ASID

问题背景

TLB分为两种:
第一种:全局tlb,内核空间是进程共享的地址空间,物理地址与虚拟地址都是一一对应的,相当于操作系统保证了不会存在同名和重名问题;
第二种:局部tlb,针对于用户空间,每个用户空间都有自己的一套页表;存在同名问题;

解决局部TLB的同名问题

arm体系架构提供了一种硬件方案,叫做进程地址空间,在原来以虚拟地址为判断条件的基础上,给tlb命中的查询标准加上了ASID

硬件实现:

  • ASID存储在TTBR0_EL1或者TTBR_EL1中,通过TCR的AI域来设置和选择其中一个TTBR来存储ASID;
  • tlb中也增加ASID域;
  • 进行查询时,增加TTBR中和tlb中的ASID匹配;

软件实现

  • ASID是怎么产生的呢?这是操作相同分配的;但注意这并不等同于进程PID;
  • Linux中的具体管理如下:ASID有8位宽,和16位宽;以8为宽来说,最多支持256个id,操作系统使用256位的位图来进行对其管理;当ASID分配完之后,那么操作系统需要冲刷TLB,并且重新分配ASID;
  • 操作系统需要将ASID写入TTBR中;

具体判断过程:

第一步:通过虚拟地址(tag,index)找到对应的TLB entry;
第二步:TLB中的ASID和ttbr中的ASID进行对比;若匹配则命中;(所以进程切换时要更新ttbr中的asid)(TLB中的ASID怎么更新的呢?)

在页表项中,有一位和TLB相关,就是nG位;

  • 当ng位为1时,这个页表对应的tlb是进程独有的,需要ASID来识别;
  • 当ng位位0时,这个页表对应的tlb项是全局的,所以不需要ASID来识别;

tlb管理指令:TLBI

  • 使所有的tlb表项失效;
  • 使ASID对应的某一个tlb项失效;
  • 使ASID对应的所有TLB失效;
  • 使虚拟地址对应的所有TLB失效;
posted @ 2024-12-25 00:19  _xingxing  阅读(58)  评论(0)    收藏  举报