📜  缓存页表

📅  最后修改于: 2021-09-27 14:58:47             🧑  作者: Mango

分页是一种内存管理方案,它允许进程的物理地址空间不连续。分页的基本思想是将物理内存分成固定大小的块,称为,将逻辑内存分成相同大小的块,称为。在执行该过程时,该过程所需的页面会从其来源(光盘或任何备份存储设备)加载到可用帧中。

CPU 为进程生成逻辑地址,该地址分为页号和页偏移量。页表包含物理内存中每个页面的基地址。基地址与页偏移量相结合定义了物理内存地址。页码用作页表的索引。页表保存在主存储器中,页表基址寄存器 (PTBR)指向页表。

要访问位置 x,请在页表中找到条目,使用 PTBR 偏移量中的值加上 x 的页码。页表项给出了帧号,它与页偏移量相结合以产生实际地址。然后我们可以访问所需的内存位置。因此,要访问位置 x ,需要进行两次内存访问,从而降低了操作速度。

称为转换后备缓冲区 (TLB) 的特殊、小型、快速查找硬件缓存用于缓存页表中的少量条目。每个TLB条目由两部分组成:key(或tag)和value,这里key是页码,value是帧号。 TLB 的所有条目同时与页号进行比较,因此搜索速度很快。一个 TLB 通常包含 32-1024 个条目。 TLB 是一种硬件缓存,现代计算机将其作为指令管道的一部分来实现,因此不会导致 TLB 搜索的开销。

如果在 TLB 中找不到页号,则称为TLB 未命中,从页表中获取相应的帧号并更新 TLB。现在如果 TLB 已经满了,则需要用这个新条目替换 TLB 的一个条目。各种策略用于此类替换,例如最近最少使用 (LRU)、循环或随机替换。

今天的 CPU 提供多级 TLB。如果 L1 TLB 未命中,则在 L2 TLB 中搜索,如果 L2 TLB 也未命中,则在页表中搜索。 在 TLB 中找到感兴趣的页码的次数的百分比称为命中率(hit rate)而在 TLB 中找不到的次数的百分比称为未命中率(miss rate) 。现代系统的 TLB 未命中率为 0.1-1%,从而在很大程度上减少了访问页表的开销。

一些 TLB 还在每个 TLB 条目中存储地址空间标识符 (ASIDS)。它唯一地标识每个进程,当逻辑地址到物理地址的转换完成时,只检查属于该进程的那些 TLB 条目,如果没有找到这样的条目,则认为 TLB 未命中。这允许 TLB 同时拥有多个进程的条目。 如果 TLB 不允许 ASIDS,那么每次发生上下文切换(将执行进程从一个进程更改为另一个进程)时,都需要刷新或擦除 TLB 以确保下一次执行流程不使用上一流程的翻译信息。

每个 TLB 条目都有一个与之关联的有效/无效位,用于表示 TLB 条目是否有效。这在 TLB 被刷新时特别有用,没有实际删除 TLB 条目,只有 TLB 的所有条目都无效。因此,在使用 TLB 条目进行翻译之前,会检查该条目是否有效。此外,如果更新 TLB 条目时 TLB 未命中,则首先更新无效条目。

TLB 条目中还有其他几个位,例如全局位 (G),用于跨进程全局共享的页面,几个位用于 ASID(对于共享页面忽略),脏位(确定是否必须写入页面) ) 等。所有这些位都用于通用 TLB 条目。但是,条目的实际大小、TLB 条目中的各种保护位、TLB 中的级别数、每个级别中的 TLB 条目数等因架构而异。