【Linux 内核知识梳理 5】什么是TLB

【Linux 内核知识梳理 5】什么是TLB

    • 1、TLB 种类
    • 2、TLB的联合方式
    • 3、CPU - TLB - Cache


  • TLB:Translation Lookaside Buffer。

根据功能可以译为快表,直译可以翻译为旁路转换缓冲,也可以把它理解为页表缓冲。
里面存放的是一些页表文件(虚拟地址 到 物理地址转换表)。

当处理器要在主内存寻址时,不是直接在内存的物理地址里查找的,而是通过一组虚拟地址转换到主内存的物理地址,
TLB就是负责将虚拟内存地址翻译成实际的物理内存地址,而CPU寻址时会优先在TLB中进行寻址。
处理器的性能就和寻址的命中率有很大的关系。


映射机制必须使一个程序能断言某个地址在其自己的进程空间或地址空间内,并且能够高效的将其转换为真实的物理地址以访问内存。
一个方法是使用一个含有整个空间内所有页的入口(entry)的表(即页表),
每个入口包含这个页的正确物理地址。这很明显是个相当大的数据结构,因而不得不存放于主存之中。


由于CPU首先接到的是由程序传来的虚拟内存地址,所以CPU必须先到物理内存中取页表,
然后对应程序传来的虚拟页面号,在表里找到对应的物理页面 号,最后才能访问实际的物理内存地址,
也就是说整个过程中CPU必须访问两次物理内存(实际上访问的次数更多)。
因此,为了减少CPU访问物理内存的次 数,引入TLB。

====================================================
 cpu                                         内存

 TLB   <============================>    内存页表

L1 Cache <=====>L2 Cache<=========>    内存数据
====================================================

1、TLB 种类

TLB在X86体系的CPU里的实际应用最早是从Intel的486CPU开始的,
在X86体系的CPU里边,一般都设有如下4组TLB:

第一组:缓存一般页表(4K字节页面)的指令页表缓存(Instruction-TLB);
第二组:缓存一般页表(4K字节页面)的数据页表缓存(Data-TLB);
第三组:缓存大尺寸页表(2M/4M字节页面)的指令页表缓存(Instruction-TLB);
第四组:缓存大尺寸页表(2M/4M字节页面)的数据页表缓存(Instruction-TLB);

【Linux 内核知识梳理 5】什么是TLB_第1张图片

图中可见,
当CPU执行机构收到应用程序发来的虚拟地址后,
首先到TLB中查找相应的页表数据,
如果TLB中正好存放着所需的页表,则称为TLB命中(TLB Hit),
接下来CPU再依次看TLB中页表所对应的物理内存地址中的数据是不是已经在一级、二级缓存里了,若没有则到内存中取相应地址所存放的数据。
如果TLB中没有所需的页表,则称为TLB失败(TLB Miss),接下来就必须访问物理内存中存放的页表,同时更新TLB的页表数据。


既然说TLB是内存里存放的页表的缓存,那么它里边存放的数据实际上和内存页表区的数据是一致的,
在内存的页表区里,每一条记录虚拟页面和物理页框对应关系的记录称之为一个页表条目(Entry),
同样地,在TLB里边也缓存了同样大小的页表条目(Entry)。

由于页表条目的大小总是固定不变的,所以TLB的容量越大,则它所能存放的页表条目数越多(类似于增大CPU一级、二级缓存容量的作用),这就意味着缓存命中率的增加,这样,就能大大减少CPU直接访问内存的次数,实现了性能提升。


2、TLB的联合方式

TLB 内部存储空间被划分为大小相同的块(即 TLB页表条目),这些块的大小=内存的页表区里页表条目的大小。

所以,就可以在TLB页表条目和内存页表条目间建立一定的相互对应关系。
当CPU需要页表数据时,它必须迅速做出如下的2个判断:

一个是所需要的页表是否已缓存在TLB内部(即判断TLB命中或是失败),另一个是所需要的页表在TLB内的哪个条目内。

为了尽量减少CPU做出这些判断所需的时间,就必须在TLB页表条目和内存页表条目之间的对应方式上动点脑筋。


3、CPU - TLB - Cache

当CPU 需要访问数据时,先解析到需要访问的虚拟地址 及 虚拟地址对应的虚拟页号,
接着在 TLB 中查找是否有与所需的虚拟页号对应的物理页号,
如果找到了,(命中了),根据查找结果,在 Cache中找到对应的数据,Cache 中缓存的是物再页面中的具体数据。

如果没有找到,只能到内存的页表区查找对应物理页号,然后根据物理页号到内存中找到地址,将该物理页面中的数据缓存到Cache 中。

所以:
TLB 是 缓存的内存中的部分页表转换(虚拟页号 与 物理页号换转换)
Cache 存放的是物理页面的具体数据。

你可能感兴趣的:(Linux内核)