MMU与TLB介绍
每个进程在内核空间都保存着自己的内存页表,在进程切换的时候,系统会把进程自己的页目录的物理地址存入到CR3寄存器中,通过CR3寄存器与进程中的线性地址进行计算可以得到真实的物理内存(如果该内存不存在则产生缺页异常,系统会去磁盘中加载)。
当CPU从地址线发出某个地址的时候,MMU或截获并转换成物理地址。MMU会去访问页表,最终找到该地址对应的内存页,在内存页中根据偏移便能找到最终的物理内存。
但是这样的过程还是显慢,MMU要多次访问页表(页表也在内存中),所以有了TLB。
TLB是translate buffer的意思。它是一段高速内存, TLB中会保存系统中频繁访问的那些内存地址对应表。 当CPU从地址线发出某个地址的时候,MMU会先去TLB中查找是否有该地址对应的物理地址。 如果没有才会去检索页表。 TLB的刷新是内核做的。
但这里还有个问题,TLB中的索引方式的问题。 因为所有进程的虚拟地址空间都一样的,如果只是简单的比较虚拟地址是否一样,那是不可行的。
这个通常的方法是TLB表中保存的地址是内存页的物理地址+页内偏移。TLB电路检查TLB缓冲区中是否有该页内偏移的索引,MMU则并行的按照虚拟地址在页表中找出相应的内存页,然后把内存页的物理地址与TLB表中匹配,如果匹配成功切TLB中也有相应的偏移的话,则直接从TLB表中返回该虚拟内存对应的物理内存内容给CPU。
那么问题来了,这样与MMU查找页表方式没多大差别呀? 而且还要维护TLB。
其实TLB的内存与普通的内存通常不一样,TLB的访问很快。(可以参看dpdk的书籍)


浙公网安备 33010602011771号