为了解决分页带来的额外内存访问,又引入了地址转换旁路缓冲存储器,又称TLB。它是一个硬件缓存,它记录了频繁发生的虚拟地址到物理地址的转换。

引入该缓存后,每次需要访问内存时,硬件会先检查TLB中是否有期望的映射,如果有就直接转换。

TLB的基本算法

硬件会先从虚拟地址中提取页号,然后检查TLB中是否有该页号(在引入TLB之前,这里需要直接访问一次内存,去读取页表),如果有,则可以根据TLB的值,经过计算得到正确的物理地址。

如果没有找到,那么硬件需要去内存访问页表,然后将映射更新到TLB当中,前提是该虚拟地址有效,而且我们有权限访问。

上下文切换时对TLB的处理

引入TLB之后,我们在发生上下文切换时,要对TLB进行特殊的处理。因为TLB记录的是某一个进程的地址空间到物理地址的转换,如果切换进程,那么当前的TLB对于另一个进程是不可用的。

一种解决方案:

在发生上下文切换时,直接清空TLB,那么就不会有进程读到错误的TLB。但是也存在问题,每个进程刚运行时,都会发生TLB未命中。

第二种解决方案:

增加一个地址空间标识符,也可以看作是进程标识符,用于标识存储的内容是那个进程的映射。这样一来,TLB可以同时缓存多个进程的地址映射。

参考

《操作系统导论》