【摘录】大话嵌入式——了解TLB工作原理
TLB(页表缓冲)工作原理
1 概念
TLB(translation lookaside buffer)快表,直译为转换检测缓冲区,也称页表缓冲,是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存。
TLB每一行都保存着一个页表项(PTE,Page Table Entry)。
TLB和CPU里的一级、二级缓存(Cache)之间不存在本质的区别,只不过TLB缓存页表数据,而Cache缓存实际数据。
2 优点
如果没有TLB,由于页表存放在主存中,因此程序每次访存至少需要两次:一次访存获取物理地址,第二次访存才获得数据。提高访存性能的关键在于依靠页表的访问局部性。当一个转换的虚拟页号被使用时,它可能在不久的将来再次被使用到。
当处理器要在主内存寻址时,不是直接在内存的物理地址里查找的,而是通过一组虚拟地址转换到主内存的物理地址,TLB就是负责将虚拟内存地址翻译成实际的物理内存地址,而CPU寻址时会优先在TLB中进行寻址。处理器的性能就和寻址的命中率有很大的关系。
3 实现
TLB和CPU里的一级、二级缓存(cache)之间不存在本质的区别,只不过TLB缓存页表数据,而Cache缓存实际数据。
3.1 TLB组成
TLB在X86体系的CPU里的实际应用最早是从Intel的486CPU开始的,在X86体系的CPU里边,一般都设有如下4组TLB:
第一组:缓存一般页表(4K字节页面)的指令页表缓存(Instruction-TLB);
第二组:缓存一般页表(4K字节页面)的数据页表缓存(Data-TLB);
第三组:缓存大尺寸页表(2M/4M字节页面)的指令页表缓存(Instruction-TLB);
第四组:缓存大尺寸页表(2M/4M字节页面)的数据页表缓存(Data-TLB);
3.2 TLB Hit(命中)
如果TLB中正好存放着所需的页表,则称为TLB命中(TLB Hit);如果TLB中没有所需的页表,则称为TLB失败(TLB Miss)。
3.3 执行过程
当CPU执行机构收到应用程序发来的虚拟地址后;
首先到TLB中查找相应的页表数据(CPU根据虚拟地址前20位到TLB中查找),如果TLB中正好存放着所需的页表,则称为TLB命中(TLB Hit);
接下来CPU再依次看TLB中页表所对应的物理内存地址中的数据是不是已经在一级、二级缓存(Cache)里了,若没有则到内存中取相应地址所存放的数据。
既然说TLB是内存里存放的页表的缓存,那么它里边存放的数据实际上和内存页表区的数据是一致的,在内存的页表区里,每一条记录虚拟页面和物理页框对应关系的记录称之为一个页表条目(Entry),同样地,在TLB里边也缓存了同样大小的页表条目(Entry)。
3.4 提高查找效率的必要性
TLB内部存放的基本单位是页表条目,对应着RAM中存放的页表条目。页表条目的大小固定不变的,所以TLB容量越大,所能存放的页表条目越多,TLB hit的几率也越大。但是TLB容量毕竟是有限的,因此RAM页表和TLB页表条目无法做到一一对应。因此CPU收到一个线性地址,那么必须快速做两个判断:
1 所需的也表示否已经缓存在TLB内部(TLB miss或者TLB hit);
2 所需的页表在TLB的哪个条目内;
为了尽量减少CPU做出这些判断所需的时间,那么就必须在TLB页表条目和内存页表条目之间的对应方式进行优化。
3.5 组相连模式(set-associative)
与Cache的组织方式类似,TLB引入组相连模式来进行管理。这种方式把所有的TLB表项分成多个组,每个线性地址块对应的不再是一个TLB表项,而是一个TLB表项组。CPU做地址转换时,首先计算线性地址块对应哪个TLB表项组,然后在这个TLB表项组顺序比对。按照组长度,我们可以称之为2路,4路,8路。
经过长期的工程实践,发现8路组相连是一个性能分界点。8路组相连的命中率几乎和全相连命中率几乎一样,超过8路,组内对比延迟带来的缺点就超过命中率提高带来的好处了。
3.6 TLB表项更新
TLB表项更新可以有TLB硬件自动发起,也可以有软件主动更新
1. TLB miss发生后,CPU从RAM获取页表项,会自动更新TLB表项
2. TLB中的表项在某些情况下是无效的,比如进程切换,更改内核页表等,此时CPU硬件不知道哪些TLB表项是无效的,只能由软件在这些场景下,刷新TLB。
4 页表(PTE, Page Table Entry)
在保护模式的分页机制下,程序使用的地址叫虚拟地址。虚拟地址必须映射到真实的物理地址上才能使用。不过这个映射过程是由硬件MMU 完成的,但是如何映射,映射到哪里这些问题则交给操作系统解决。CPU使用目录和页表进行地址转译。
虚拟地址在映射之前是不能使用的,必须和物理地址建立映射。映射的机制就在虚拟地址所在页面对应的页目录和页表项,按照硬件PTE 填写页目录和页表项内容。PTE 结构高20 位是物理内存页帧号,这个虚拟地址所在的虚拟页面就对应页帧号的物理页面。读写虚拟地址就是读写物理地址。
给出任意一个页目录项,能找到对应的页表范围,也能找到所对应的虚拟内存范围。一个页目录项管理4MB 虚拟内存大小。如页目录项768,对应的页表项是7681024 = 0xC0000。每一个页表的项数是1024,所以页目录项768 对应的页表范围是0xC0000—0xC03ff。每一页表项管理一页虚拟内存,0xC0000 4096 = 0xC0000000,0xC03ff 4096 = 0xC03ff000。所以页目录项768 对应的页面范围是0xC0000000—0xC03ff000。给出任意一个页表项,也能找到页目录项,如0xC0000 页表项,除以1024 就得到对应的页目录项768。给出任意一个虚拟地址,也能找到页目录项和页表项,比如虚拟地址0x003ff000,除以4096 得到对应的页表项1023;除以0x00400000(4M)得到对应的页目录项0。
5 补充知识—虚拟地址与物理地址
物理地址 (physical address):放在寻址总线上的地址。放在寻址总线上,如果是读,电路根据这个地址每位的值就将相应地址的物理内存中的数据放到数据总线中传输。如果是写,电路根据这个地址每位的值就在相应地址的物理内存中放入数据总线上的内容。物理内存是以字节(8位)为单位编址的。
虚拟地址 (virtual address):CPU启动保护模式后,程序运行在虚拟地址空间中。注意,并不是所有的“程序”都是运行在虚拟地址中。CPU在启动的时候是运行在实模式的,Bootloader以及内核在初始化页表之前并不使用虚拟地址,而是直接使用物理地址的。
如果CPU寄存器中的分页标志位被设置(对于Intel CPU 来说,分页标志位是寄存器CR0的第31位,为1表示使用分页,为0表示不使用分页),那么执行内存操作的机器指令时,CPU(准确来说,是MMU,即Memory Management Unit,内存管理单元)会自动根据页目录和页表中的信息,把虚拟地址转换成物理地址,完成该指令。
一个虚拟地址,大小4个字节(32bit),包含着找到物理地址的信息,分为3个部分:
(1)第22位到第31位(高10位)是页目录中的索引;
(2)第12位到第21位(中10位)是页表中的索引;
(3)第0位到第11位(低12位)是页内偏移。
一个虚拟地址转换成物理地址的计算过程就是,处理器通过CR3找到当前页目录所在物理页,取虚拟地址的高10bit,然后把这10bit左移2bit(因为每个页目录项4个字节长,左移2bit相当于乘4)得到在该页中的地址,取出该地址处PDE(4个字节),就找到了该虚拟地址对应页表所在物理页,取虚拟地址第12位到第21位这10位,然后把这10bit左移2bit(因为每个页表项4个字节长,左移2bit相当于乘4)得到在该页中的地址,取出该地址处的PTE(4个字节),就找到了该虚拟地址对应物理页的地址,最后加上12bit的页内偏移得到了物理地址。
一个32bit指针,可以寻址范围0x00000000-0xFFFFFFFF,4GB大小。也就是说一个32bit的指针可以寻址整个4GB地址空间的每一个字节。一个页表项负责4K的地址空间和物理内存的映射,一个页表1024项,也就是负责1024*4k=4M的地址空间的映射。一个页目录项,对应一个页表。一个页目录有1024项,也就对应着1024个页表,每个页表负责4M地址空间的映射。1024个页表负责1024*4M=4G的地址空间映射。一个进程有一个页目录。所以以页为单位,页目录和页表可以保证4G的地址空间中的每页和物理内存的映射。
6 参考网址
http://baike.baidu.com/link?url=NBE8RpO-_S5eqAi7sTDCnsxA0iFyaj8v3RYSMTALwLMv99GZc13MijLwVNkmdHQGJKBFqBgX-HdFGfR25qwz1K
http://blog.csdn.net/hulihong/article/details/19072533
http://book.51cto.com/art/201502/465675.htm
http://baike.baidu.com/link?url=SnvgptGkQGWSC3JN43T1ich8Y5aaL_nM7vG1GRiaY1RlL-hXL9tYCdGw6TmyVZ11A2QpBaHij-hIhOJvL62M-K_vEY237l0uqAzWsA1s4PBM2H-PF9ua7JB7VAlPOGT
- 点赞
- 收藏
- 关注作者
评论(0)