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失效;

浙公网安备 33010602011771号