一、介绍
1.TLB的由来
TLB是地址转换后援缓冲器(Translation Lookaside Buffer)的简称,也可简称为“快表”。首先,MMU的作用是把虚拟地址转换为物理地址。虚拟地址和物理地址的映射关系存储在页表中,而页表又是分级的。64位系统一般都是3~5级,常见的配置是4级页表。在硬件上会有一个叫做页表基地址寄存器,MMU就是根据页表基地址寄存器一路查到PTE,最终找到物理地址(PTE页表中存储物理地址)。简单地说,TLB就是页表的Cache,属于MMU的一部分,其中存储了当前最可能被访问到的页表项,其内容是部分页表项的一个副本。处理器在取指或者执行访问memory指令的时候都需要进行地址翻译,即把虚拟地址翻译成物理地址。
以上图为例,在你告诉我你的地址后,我想在地图上查询到地址在哪一样,为了找到对应的地址,先确定国家是中国,再确定省份是某个省,继续往下某个市,最后找到具体地址是一样的原理,一级一级找下去,可想而知这个过程非常繁琐。如果第一次查到的具体位置,并记下来具体的地址并建立索引。下次查找时,只需要索引就直接能够得到具体地址,而不需要一级一级查找。四级页表查找过程需要四次内存访问。延时可想而知,非常影响性能。
因为地址翻译是一个漫长的过程,需要遍历几个level的Translation table,从而产生严重的开销。为了提高性能,所以在MMU中增加一个TLB的单元,把地址翻译关系保存在这个高速缓存中,从而省略了对内存中页表的访问。如下图:
TLB存放了之前已经进行过地址转换的查询结果。这样,当同样的虚拟地址需要进行地址转换的时候,可以直接在 TLB 里面查询结果,而不需要多次访问内存来完成一次转换。
2.TLB的本质是什么
TLB其实就是一块高速缓存。数据cache缓存地址(虚拟地址或者物理地址)和数据。TLB缓存虚拟地址和其映射的物理地址。TLB根据虚拟地址查找cache,它没得选,只能根据虚拟地址查找。所以TLB是一个虚拟高速缓存。硬件存在TLB后,虚拟地址到物理地址的转换过程发生了变化。虚拟地址首先发往TLB确认是否命中cache,如果cache hit直接可以得到物理地址。否则,一级一级查找页表获取物理地址。并将虚拟地址和物理地址的映射关系缓存到TLB中。
3.TLB组成
在CPU里,一般设有如下4组TLB:
1)Instruction-TLB:缓存一般页表(4K字节页面)的指令页表缓存;
2)Data-TLB:缓存一般页表(4K字节页面)的数据页表缓存;
3)Instruction-TLB:缓存大尺寸页表(2M/4M字节页面)的指令页表缓存;
4)Data-TLB:缓存大尺寸页表(2M/4M字节页面)的数据页表缓存。
二、TLB实现原理
1.TLB中的映射方式
TLB中项的映射方式有三种:全关联方式、直接映射方式、分组关联方式,如下表所示
映射方式 | 原理 | 优点 | 缺点 |
全关联 | TLB中的任意一个表项都可以用来缓存任何一个内存页的页表项。即一个虚拟页面对应的页表项可以存放在TLB的任何位置。 | 冲突概率最低,TLB的利用率最高 | 当TLB表项发生冲突时,替换策略较复杂,且每次访问TLB时都需要比较TLB中的所有表项,硬件实现较复杂 |
直接映射 | TLB中的每一个表项都与一个固定的虚拟页面相对应。即一个虚拟页面只能映射到TLB中的一个固定位置。 | 硬件实现简单,每次访问TLB时只需要计算固定的地址并读取对应的表项 | 由于每个虚拟页面只能映射到TLB中的一个固定位置,因此TLB的冲突概率较高,可能导致TLB的利用率较低 |
分组关联 | 分组关联映射是全关联映射和直接映射的折中方案。它将TLB划分为多个组,每个组内的表项采用直接映射方式,而组间则采用全关联方式。 | 既降低了硬件实现的复杂度,又在一定程度上提高了TLB的利用率和降低了冲突概率 | 分组策略需要根据实际应用场景来选择合适的组大小和数量,这需要对系统的内存访问特性和TLB的大小进行充分的分析和评估 |
2.TLB的转换过程
TLB中的项由两部分组成:标识和数据。标识中存放的是虚地址的一部分,而数据部分中存放物理页号、存储保护信息以及其他一些辅助信息。虚地址与TLB中项的映射方式有三种:全关联方式、直接映射方式、分组关联方式。
以直接映射方式是指每一个虚拟地址只能映射到TLB中唯一的一个表项。假设内存页大小是8KB,TLB中有64项,采用直接映射方式时的TLB变换原理如图下图所示:
因为页大小是8KB,所以虚拟地址的0-12bit作为页内地址偏移。
TLB表有64项,所以虚拟地址的13-18bit作为TLB表项的索引。
假如虚拟地址的13-18bit是1,那么就会查询TLB的第1项,从中取出标识,与虚拟地址的19-31位作比较,如果相等,表示TLB命中,反之,表示TLB失靶。TLB失靶时,可以由硬件将需要的页表项加载入TLB,也可由软件加载,具体取决于处理器设计。TLB命中时,此时翻译得到的物理地址就是TLB第1项中的标识(即物理地址13-31位)与虚拟地址0-12bit的结合。
在地址翻译的过程中还会结合TLB项中的辅助信息进行判断。数据区的辅助信息包括有效位(Valid)、引用位(reference)和脏位(dirty),内容如下:
- 有效位(Valid):对于操作系统,所有的数据都不会加载进内存,当数据不在内存的时候,就需要到硬盘查找并加载到内存。当为1时,表示在内存上,为0时,该页不在内存,就需要到硬盘查找。
- 引用位(reference):由于TLB中的项数是一定的,所以当有新的TLB项需要进来但是又满了的话,如果根据LRU算法,就将最近最少使用的项替换成新的项。故需要引用位。同时要注意的是,页表中也有引用位。
- 脏位(dirty):当内存上的某个块需要被新的块替换时,它需要根据脏位判断这个块之前有没有被修改过,如果被修改过,先把这个块更新到硬盘再替换,否则就直接替换。
当CPU收到应用程序发来的虚拟地址后,首先去TLB中根据标志Tag寻找页表数据,假如TLB中正好存放所需的页表并且有效位是1,说明TLB命中了,那么直接就可以从TLB中获取该虚拟页号对应的物理页号。
假如有效位是0,说明该页不在内存中,这时候就发生缺页异常,CPU需要先去外存中将该页调入内存并将页表和TLB更新
假如在TLB中没有找到,就通过分页机制来实现虚拟地址到物理地址的查找。
如果TLB已经满了,那么还要设计替换算法来决定让哪一个TLB entry失效,从而加载新的页表项。
如果是TLB命中,那么引用位就会被置1,当TLB或页表满时,就会根据该引用位选择适合的替换位置
如果TLB命中且这个访存操作是个写操作,那么脏位就会被置1,表明该页被修改过,当该页要从内存中移除时会先执行将该页写会外存的操作,保证数据被正确修改。所以TLB设计的原理可以总结为下图所示:
当要通过一个虚拟地址访问一个物理地址内存时:
· 检查该页表是否在TLB中,如在则直接访问物理地址;
· 如果该页表不在TLB中,则发生TLB miss,去页表中查找,如果在页表中也没找到,就会发生缺页异常;如果找到了则继续访问物理地址;