TLB及其工作原理

一、介绍

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),内容如下:

  1. 有效位(Valid):对于操作系统,所有的数据都不会加载进内存,当数据不在内存的时候,就需要到硬盘查找并加载到内存。当为1时,表示在内存上,为0时,该页不在内存,就需要到硬盘查找。
  2. 引用位(reference):由于TLB中的项数是一定的,所以当有新的TLB项需要进来但是又满了的话,如果根据LRU算法,就将最近最少使用的项替换成新的项。故需要引用位。同时要注意的是,页表中也有引用位。
  3. 脏位(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,去页表中查找,如果在页表中也没找到,就会发生缺页异常;如果找到了则继续访问物理地址;

  • 17
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会写代码的小可爱&&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值