资讯详情

一文带你详解,你不知道的《TLB的作用及工作原理》赶快收藏起来

TLB作用及工作流程

  • 页面通常很大,存储在内存中,所以引入处理器MMU之后,读取指令和数据需要访问两个内存:首先通过查询页面获取物理地址,然后访问物理地址读取指令和数据。减少因为MMU引入处理器性能下降TLB,TLB是Translation Lookaside Buffer缩写可以翻译成地址转换后援缓冲器或快表。简单地说,TLB就是页表的Cache,目前最有可能被访问的页表项存储在其中,其内容是部分页表项的副本。只有在TLB无法完成地址翻译任务时,才会到内存中查询页表,这样就减少了页表查询导致的处理器性能下降。

  • TLB项目由标识和数据两部分组成。虚拟地址的一部分存储在标识中,物理页号、存储保护信息等辅助信息存储在数据部分中。虚地址与TLB中项有三种映射方式:全相关、直接映射、分组相关。OR直接映射是在1200处理器中实现的,所以本书只介绍直接映射。直接映射是指每个虚拟地址只能映射到TLB唯一的表项。假设内存页面大小为8KB,TLB其中64项采用直接映射法TLB变换原理如图10所示.4所示。

  • 因为页面大小是8KB,因此,虚拟地址0-12bit作为页面地址偏移。TLB有64个表,所以虚拟地址的13-18bit作为TLB表项索引。假如虚拟地址的13-18bit是1,然后会查询TLB第一项,从中取出标识,与虚拟地址的19-31位进行比较,如果相等,则表示TLB相反,命中,表示TLB失靶。TLB失靶时,可以由硬件将需要的页表项加载入TLB,也可由软件加载,具体取决于处理器设计,OR软件只能实现1200不提供硬件加载页表项的功能。TLB当命中时,翻译得到的物理地址是TLB标识(即物理地址13-31位)和虚拟地址0-12bit的结合。在地址翻译译过程TLB项目中的辅助信息判断是否违反安全策略,如修改页面,但禁止修改页面,此时违反安全策略,会触发异常。

  • OR1200中的MMU分为指令MMU、数据MMU,分别简称为IMMU、DMMU。采用页面内存管理机制,每页大小8KB,软件需要实现页表管理、页表查询、更新、定等功能。实际上OR1200的MMU模块的主要实现是TLB,OR1200中TLB可配置大小,默认为64项,直接映射。IMMU中有ITLB,DMMU中有DTLB,但是ITLB、DTLB软件还需要实现加载、更新、故障、替换等功能。本章将从下一节开始IMMU、DMMU进行分析。

TLB工作原理

  • TLB - translation lookaside buffer

  • 快表,直译为旁路快表缓冲,也可理解为页表缓冲,地址变换高速缓存。

  • 由于页面存储在主存储器中,程序每次至少需要两次访问存储器:一次访问存储器以获取物理地址,第二次访问存储器以获取数据。提高访问存储性能的关键是依靠页面表的访问局部性。当使用转换的虚拟页面号时,它可能会在不久的将来再次使用。

  • TLB使用内存管理硬件来提高从虚拟地址到物理地址的转换速度是一种高速缓存。目前,所有个人桌面、笔记本电脑和服务器处理器都使用TLB从虚拟地址到物理地址进行映射。使用TLB内核可以快速找到指向物理地址的虚拟地址,而无需要求RAM从虚拟地址到物理地址的内存映射关系。这与data cache和instruction caches有很大的相似之处。

TLB原理

  • 当cpu在访问虚拟地址/线性地址时,CPU首先,虚拟地址的高度是20位(20位)x86具体,不同的架构有不同的值)TLB中查找。如果表中没有相应的表项,则称为TLB miss,慢速访问是必要的RAM计算相应的物理地址。同时,物理地址被存放在一个TLB在表项中,以后直接访问同一线性地址TLB在表项中获取物理地址称为TLB hit。

  • 想像一下x86_32架构下没有TLB对于线性地址的访问,从存在时的情况开始PGD中获取PTE(第一次内存访问),PTE获取页框地址(第二次内存访问),最终访问物理地址需要三次RAM访问。如果有TLB存在,并且TLB hit,所以只需要一次RAM访问即可。

TLB表项

  • TLB内部存储的基本单位是页面条目,对应于RAM存储在页面条目中。页面条目的大小是固定的,所以TLB容量越大,页面条目就越多,TLB hit但是TLB毕竟容量有限,所以RAM页表和TLB页面条目不能一一对应。CPU如果收到线性地址,必须快速做出两个判断:

  1. 所需也表示是否缓存TLB内部(TLB miss或者TLB hit)

  2. 所需页表在TLB在哪个条目内

  • 尽量减少CPU做出这些判断所需的时间必须是TLB在页面条目和内存页面条目之间做足功夫

数据直通车:Linux核源码技术学习路线 核源码在视频教程中

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

全相连 - full associative

  • 在这种组织方式下,TLB cache表项和线性地址之间没有关系,也就是说,一个TLB表项可以与任何线性地址的页面项相关联。这种关联方式使得TLB表项空间利用率最高。但延迟也可能相当大,因为每次CPU请求,TLB线性地址和硬件TLB表项逐一比较,直到TLB hit或者所有TLB比较完成表项。特别是随着CPU缓存越来越大,需要大量的缓存TLB因此,这种组织方法只适用于小容量TLB

  • 直接匹配

  • 每个线性地址块都可以通过模具操作对应于唯一的TLB表项只需要比较一次,减少TLB内部延迟。然而,这种方式发生冲突的概率非常高,导致冲突TLB miss命中率降低。

  • 例如,我们假设TLB cache共16个表项,CPU1. 17 , 1, 33。当CPU访问地址块1时,1 mod 16 = 1,TLB检查它的第一个页面项是否包含指定的线性地址块1,包含,否则从RAM装入;然后CPU方位地址块17,17 mod 16 = 1,TLB发现其第一页表项对应的不是线性地址块17,TLB miss发生,TLB访问RAM将地址块17的页表项装入TLB;CPU接下来,访问地址块1,此时又发生了miss,TLB只好访问RAM重新安装地址块1对应的页表项。因此,在某些特定的访问模式下,直接匹配的性能很差

组相连 - set-associative

  • 为了解决全相连内部效率低、直接匹配的冲突,引入了组相连。这样,所有的东西都被这样做了TLB表项分为多组,每个线性地址块对应的不再是一组TLB表项,但一个TLB表项组。CPU在进行地址转换时,首先计算线性地址块对应对应TLB表项组,然后在这里TLB表项组顺序比较。按组长,可称为2路、4路、8路。

  • 经过长期的工程实践,发现8路组连接是一个性能分界点。8路组连接的命中率几乎与全连接的命中率相同。如果超过8路,组中比较延迟的缺点将超过命中率提高的好处。

  • 这三种方法各有优缺点。组连接是一个折衷的选择,适合大多数应用环境。当然,其他领域也可以用于不同的领域cache组织形式。

TLB表项更新

  • TLB可以有表项更新TLB自动启动硬件,也可以主动更新软件

  1. TLB miss发生后,CPU从RAM获取页表项将自动更新TLB表项

  2. TLB在某些情况下,表项无效,如过程切换、内核页表更改等CPU硬件不知道什么TLB表项无效,软件只能在这些场景下刷新TLB。

  • 在linux kernel提供丰富的软件层TLB表项刷新方法,但不同的系统结构提供不同的硬件接口。x86_32只提供了两个硬件接口来刷新TLB表项:

  1. 向cr当寄存器写入值时,处理器会自动刷新非全局页面TLB表项

  2. 在Pentium Pro以后,invlpg汇编指令用于无效指定单个线性地址TLB表项无效。

MMU和cache详解(TLB机制)

1. MMU

  • MMU:memory management unit,称为内存管理单元,或存储管理单元,MMU它是一种保存在主存的硬件设备(main memory)两级也由协处理器控制CP15寄存器1的M位决定enabled还是disabled。MMU主要作用是负责CPU将内核发出的虚拟地址映射到物理地址,并提供硬件机制的内存访问权限检查。MMU让每个用户过程都有自己的地址空间(对于WINCE5.0,每个进程是32MB;而对于WNCE6.0,每个进程的独占的虚拟空间是2GB),并通过内存访问权限的检查保护每个进程所用的内存不被其他进程破坏。

  • 下面是MMU提供的功能和及其特征

VA和PA

VA到PA的映射过程

  • 首先将CPU内核发送过来的32位VA[31:0]分成三段,前两段VA[31:20]和VA[19:12]作为两次查表的索引,第三段VA[11:0]作为页内的偏移,查表的步骤如下:

  1. 从协处理器CP15的寄存器2(TTB寄存器,translation table base register)中取出保存在其中的第一级页表(translation table)的基地址,这个基地址指的是PA,也就是说页表是直接按照这个地址保存在物理内存中的。

  2. 以TTB中的内容为基地址,以VA[31:20]为索引值在一级页表中查找出一项(2^12=4096项),这个页表项(也称为一个描述符,descriptor)保存着第二级页表(coarse page table)的基地址,这同样是物理地址,也就是说第二级页表也是直接按这个地址存储在物理内存中的。

  3. 以VA[19:12]为索引值在第二级页表中查出一项(2^8=256),这个表项中就保存着物理页面的基地址,我们知道虚拟内存管理是以页为单位的,一个虚拟内存的页映射到一个物理内存的页框,从这里就可以得到印证,因为查表是以页为单位来查的。

  4. 有了物理页面的基地址之后,加上VA[11:0]这个偏移量(2^12=4KB)就可以取出相应地址上的数据了。

  • 这个过程称为Translation Table Walk,Walk这个词用得非常形象。从TTB走到一级页表,又走到二级页表,又走到物理页面,一次寻址其实是三次访问物理内存。注意这个“走”的过程完全是硬件做的,每次CPU寻址时MMU就自动完成以上四步,不需要编写指令指示MMU去做,前提是操作系统要维护页表项的正确性,每次分配内存时填写相应的页表项,每次释放内存时清除相应的页表项,在必要的时候分配或释放整个页表。

CPU访问内存时的硬件操作顺序

  • CPU访问内存时的硬件操作顺序,各步骤在图中有对应的标号:

  1. CPU内核(图中的ARM)发出VA请求读数据,TLB(translation lookaside buffer)接收到该地址,那为什么是TLB先接收到该地址呢?因为TLB是MMU中的一块高速缓存(也是一种cache,是CPU内核和物理内存之间的cache),它缓存最近查找过的VA对应的页表项,如果TLB里缓存了当前VA的页表项就不必做translation table walk了,否则就去物理内存中读出页表项保存在TLB中,TLB缓存可以减少访问物理内存的次数。

  2. 页表项中不仅保存着物理页面的基地址,还保存着权限和是否允许cache的标志。MMU首先检查权限位,如果没有访问权限,就引发一个异常给CPU内核。然后检查是否允许cache,如果允许cache就启动cache和CPU内核互操作。

  3. 如果不允许cache,那直接发出PA从物理内存中读取数据到CPU内核。

  4. 如果允许cache,则以VA为索引到cache中查找是否缓存了要读取的数据,如果cache中已经缓存了该数据(称为cache hit)则直接返回给CPU内核,如果cache中没有缓存该数据(称为cache miss),则发出PA从物理内存中读取数据并缓存到cache中,同时返回给CPU内核。但是cache并不是只去CPU内核所需要的数据,而是把相邻的数据都去上来缓存,这称为一个cache line。ARM920T的cache line是32个字节,例如CPU内核要读取地址0x30000134~0x3000137的4个字节数据,cache会把地址0x30000120~0x3000137(对齐到32字节地址边界)的32字节都取上来缓存。

  5. ARM920T支持多种尺寸规格的页表

  • ARM体系结构最多使用两级页表来进行转换,页表由一个个条目组成,每个条目存储一段虚拟地址对应的物理地址及访问权限,或者下一级页表的地址。S3C2443最多会用到两级页表,已段(section,大小为1M)的方式进行转换时只用到一级页表,以页(page)的方式进行转换时用到两级页表。而页的大小有3种:大页(large pages,64KB),小页(small pages,4KB)和极小页(tiny pages,1KB)。条目也成为描述符,有段描述符、大页描述符、小页描述符和极小页描述符,分别保存段、大页、小页和极小页的起始物理地址,见下图

MMU的查表过程,首先从CP15的寄存器TTB找到一级页表的基地址,再把VA[31:20]作为索引值从表中找出一项,这个表项称为一级页描述符(level one descriptor),一个这样的表项占4个字节,那么一级页表需要保存的物理内存的大小是4*4096=16KB,表项可以是一下四种格式之一:

  1. 如果描述符的最低位是00,属于fault格式,表示该范围的VA没有映射到PA。

  2. 如果描述符的最低位是10,属于section格式,这种格式没有二级页表而是直接映射到物理页面,一个色彩体哦你是1M的大页面,描述符中的VA[31:20]就是这个页面的基地址,基地址的VA[19:0]低位全为0,对齐到1M地址边界,描述符中的domain和AP位控制访问权限,C、B两位控制缓存。

  3. 如果描述符的最低两位是01或11,则分别对应两种不同规格的二级页表。根据地址对齐的规律想一下,这两种页表分别是多大?从一级描述符中取出二级页表的基地址,再把VA的一部分作为索引去查二级描述符(level two descriptor),如果是coarse page,则VA[19:12](2^8=256)作为查找二级页表表项的索引;如果是fine page,则VA[19:10](2^10=024)。二级描述符可以是下面四种格式之一:

  • 二级描述符最低两位是00是属于fault格式,其它三种情况分别对应三种不同规格的物理页面,分别是large page(64KB)、small page(4KB)和tiny page(1KB),其中large page和small page有4组AP权限位,每组两个bit,这样可以为每1/4个物理页面分别设置不同的权限,也就是说large page可以为每16KB设置不同的权限,small page可以为每1KB设置不同的权限。

  • ARM920T提供了多种页表和页面规格,但操作系统只采用其中一种,WINCE采用的就是一级描述符是coarse page table格式(也即由VA[19:12]来作为查找二级页表项的索引),二级描述符是small page格式(也即是VA[11:0]来作为查找物理页面偏移量的索引),每个物理页面大小是4KB。

  • 根据上图我们来分析translation table walk的过程

  1. VA被划分为三段用于地址映射过程,各段的长度取决于页描述符的格式。

  2. TTB寄存器中只有[31:14]位有效,低14位全为0,因此一级页表的基地址对齐到16K地址边界,而一级页表的大小也是16K。

  3. 一级页表的基地址加上VA[31:20]左移两位组成一个物理地址。想一想为什么VA[31:20]要左移两位占据[13:2]的位置,而空出[1:0]两位呢?应该是需要空出最低两位用于表示当前要寻找的一级描述符是coarse page格式,目前不清楚,有待了解。

  4. 用这个组装的物理地址从物理内存中读取一级页表描述符,这是一个coarse page table格式的描述符。

  5. 通过domain权限检查后,coarse page table的基地址再加上VA[19:12]左移两位组装成一个物理地址。

  6. 用这个组装的物理地址从物理内存中读取二级页表描述符,这是一个small page格式的描述符。

  7. 通过AP权限检查后,small page的基地址再加上VA[11:0]就是最终的物理地址了。

Linux内核-内存-硬件高速缓存和TLB原理

硬件高速缓存和TLB原理

基本概念

  1. 硬件高速缓存的引入是为了缩小CPU和RAM之间的速度不匹配,高速缓存单元插在分页单元和主内存之间,它包含一个硬件高速缓存内存和一个高速缓存控制器。高速缓存内存存放内存中真正的行。高速缓存控制器存放一个表项数组,每个表项对应高速缓存内存中的一个行,如下图:

2.除了通用硬件高速缓存,80x86处理器还包含了另一个称为转换后援缓冲器或TLB(Translation Lookaside Buffer)的高速缓存用于加快线性地址的转换。TLB是一个小的、虚拟寻址的缓存,其中的每一行都保存着一个由单个页表条目组成的块。

原理

  • 下面通过一个具体的地址翻译示例来说明缓存和TLB的原理(注意:这是简化版的示例,实际过程可能复杂些,不过原理相同),地址翻译基于以下设定:

  1. 存储器是按字节寻址的

  2. 存储器访问是针对1字节的字的

  3. 虚拟地址(线性地址)是14位长的

  4. 物理地址是12位长的

  5. 页面大小是64字节

  6. TLB是四路组相连的,总共有16个条目

  7. L1 Cache是物理寻址、直接映射的,行大小为4字节,总共有16个组

  • 下面给出小存储系统的一个快照,包括TLB、页表的一部分和L1高速缓存

  • 虚拟地址(TLBI为索引):

  • TLB:四组,16个条目,四路组相连(PPN为物理页号):

  • 页表:只展示前16个页表条目(PTE)

  • 物理地址(CO为块偏移):

  • 高速缓存:16个组,4字节的块,直接映射

  • 基于以上的设定,我们来看下当CPU执行一条读地址0x3d4(虚拟地址)处字节的加载指令时发生了什么:

  • 从0x3d4中取出如下几个字段:

  1. TLBT: 0x03

  2. TLBI: 0x03

  3. VPN: 0x0F

  4. VPO: 0x14

  • 首先,MMU从虚拟地址中取出以上字段,然后检查TLB,看它是否因为前面的某个存储器的引用而缓存了PTE0x0F的一个拷贝。TLB从VPN中抽取出TLB索引(TLBI:0x03)和TLB标记(TLBT:0x03),由上面的TLB表格可知,组0x3的第二个条目中有效匹配,所以命中,将缓存的PPN(0x0D)返回给MMU。

  • 将上述的PPN(0x0D)和来自虚拟地址的VPO(0x14)连接起来,得到物理地址(0x354)。

  • 接下来,MMU发送物理地址给缓存,缓存从物理地址中取出缓存偏移CO(0x0)、缓存组索引CI(0x5)以及缓存标记CT(0x0D)。

  • 从上面高速缓存表格中可得,组0x5中的标记与CT相匹配,所以缓存检测到一个命中,读出在偏移量CO处的数据字节(0x36),并将它返回给MMU,随后MMU将它传递回CPU。

标签: 直通组装式连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台