8

是否有一个体面的指南来解释如何在ARM1176JZF-S内核上使用 TLB(翻译后备缓冲区)表?

在查看了该 ARM 平台的技术文档后,我仍然不知道 TLB 是什么或它看起来像什么。据我了解,每个 TLB 条目都将一个虚拟页面映射到一个物理页面,从而允许重新映射和控制内存权限。

除此之外,我完全不知道如何使用它们。

  • TLB 条目有什么结构?如何创建新条目?
  • 如何在用户空间线程的上下文切换中处理 VM?如何确保这些线程只能访问分配给其父进程的特定页面(强制内存保护)?我是否为每个上下文保存 TLB 状态?
  • 为什么有两个 TLB?如果 MicroTLB 只能有 10 个条目,我可以使用它做什么?当然,我需要超过 10 个。
  • 它说主要 TLB 的一部分是“一个由八个元素组成的全关联数组,可锁定”。那是什么?主 TLB 是否只能有 8 个条目?

先感谢您。如果有人解释什么是 TLB,我会非常高兴。我目前正在为我的内核开发一个内存映射器,而且我几乎走到了死胡同。

4

1 回答 1

17

ARM1176JZF-S 的技术参考手册似乎是 DDI 0301。该文档包含该特定 ARM 内核的所有具体细节。

我仍然不知道 TLB 是什么或它看起来像什么。据我了解,每个 TLB 条目都将一个虚拟页面映射到一个物理页面,从而允许重新映射和控制内存权限。

TLB 是页表的缓存。一些处理器允许直接访问 TLB,但对页表一无所知(例如:MIPS),而另一些处理器则知道页表,并在内部使用程序员通常看不到的 TLB(例如:x86)。在这种情况下,TLB 由硬件管理,系统程序员只需要注意使 TTB(Translation Table Base)寄存器指向页表,并在适当的地方使 TLB 无效。

TLB 条目有什么结构?如何创建新条目?

由硬件完成。在 TLB 未命中时,MMU 遍历页表并从那里填充 TLB。

如何在用户空间线程的上下文切换中处理 VM?

一些平台具有简单地将虚拟地址映射到物理地址的 TLB(例如:x86)。在这些平台上,您必须在每次上下文切换时执行完整的 TLB 刷新。其他平台(MIPS,这个特定的 ARM 内核)将(ASID,虚拟地址)对映射到物理地址。ASID 是应用程序特定标识符,即:进程的标识符。MMU 使用一个寄存器来知道要使用哪个 ASID(我认为在这种情况下它是 Context ID 寄存器)。由于进程可能比 ASID 多,因此有时您可能需要回收 ASID(将其分配给不同的进程)并执行 TLB 刷新(这就是通过 ASID 使 TLB 无效操作的用途)。

为什么有两个 TLB?如果 MicroTLB 只能有 10 个条目,我可以使用它做什么?当然,我需要超过 10 个。

这与您拥有用于指令和数据的小型独立 1 级缓存的原因完全相同。由于它们是缓存,因此您不需要超过 10 个(尽管拥有更多可以提高性能)。

它说主要 TLB 的一部分是“一个由八个元素组成的全关联数组,可锁定”。那是什么?主 TLB 是否只能有 8 个条目?

一些内存页面(例如:内核的某些部分)被非常频繁地访问。锁定它们是有意义的,因此它们不会被 TLB 抛出。此外,在实时系统上,TLB 未命中或缓存未命中可能会引入一些不需要的不可预测性。因此,可以选择锁定多个 TLB 条目。主 TLB 有更多条目,但只有这 8 个是可锁定的。

于 2012-01-24T20:42:14.617 回答