ARM11翻译后备缓冲器(TLB)用法?

8

有没有一个不错的指南解释如何在ARM1176JZF-S核心上使用TLB(Translation Lookaside Buffers)表?

在阅读了该ARM平台的技术文档后,我仍然不知道TLB是什么以及它的样子。据我所了解,每个TLB条目将虚拟页面映射到物理页面,实现重新映射和控制内存权限。

除此之外,我对如何使用它们一无所知。

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

提前致谢。 如果有人能够解释一下 TLB 是什么,我会非常高兴。我目前正在为我的内核工作在一个内存映射器上,但我已经基本上陷入了死局。


你在编写自己的操作系统吗?如果你正在使用现有的操作系统,它们会为你处理这些细节。在启动过程中,你可能需要手动设置1-2个TLB,但之后操作系统内核会为你处理。 - gravitron
@gravitron 我正在将一个现有的内核(Darwin)移植到ARM平台。该内核依赖于一组HAL函数,这些函数抽象了与平台的所有交互(物理内存管理、上下文切换、缓存、异常等)。 - Kristina Brooks
一个简单的答案是:TLB 对于 MMU 页表就像 Cache 对于 内存 一样;也就是说,TLB 是一个 MMU 缓存。微型 TLB -> L1缓存等。有趣的是,缓存的VIVT/PIPT等行为可能会影响由 ninjalj 描述的 TLB 操作。 - artless noise
1个回答

17

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

我仍然不知道TLB是什么,也不知道它长什么样子。据我所知,每个TLB条目将虚拟页映射到物理页,允许重新映射和控制内存权限。

TLB是页表的高速缓存。一些处理器允许直接访问TLB,而对页表一无所知(例如:MIPS),而其他处理器知道页表,并在内部使用程序员大多看不见的TLB(例如:x86)。在这种情况下,TLB由硬件管理,系统程序员只需要关心使TTB(转换表基址)寄存器指向页表,并在适当的位置使TLB失效。

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

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

如何处理用户空间线程的上下文切换中的虚拟内存?

一些平台的TLB只是简单地将虚拟地址映射到物理地址(例如:x86)。在这些平台上,您必须在每个上下文切换时进行完全的TLB清除。其他平台(MIPS,这个特定的ARM核心)将(ASID,虚拟地址)对映射到物理地址。ASID是应用程序特定标识符,即进程的标识符。MMU使用一个寄存器来知道要使用哪个ASID(我认为在这种情况下是Context ID寄存器)。由于可能存在的进程数量多于ASID数量,偶尔您可能需要回收一个ASID(将其分配给不同的进程)并进行TLB清除(这就是Invalidate TLB by ASID操作的作用)。

为什么有两个TLB?如果MicroTLB只能有10个条目,我该如何使用它?我肯定需要比10个更多的条目。

有两个TLB是因为它们具有不同的作用。MicroTLB只缓存最近使用的少量页面映射,可以快速地处理常见的内存访问模式。主TLB则缓存完整的页面映射表,并用于处理不常见的内存访问。如果您需要更多条目,则可以使用大型页表,从而使每个TLB条目覆盖更多的内存页。

这正是为什么指令和数据都有小型的分离的一级缓存的原因。由于它们是缓存,你不需要超过10个(尽管有更多可能会提高性能)。

文中提到主TLB的其中一个部分是“具有完全关联的8个元素的数组,可锁定”。那是什么?我只能在主TLB中拥有8个条目吗?

一些内存页面(例如内核的某些部分)经常被访问。将它们锁定以防止它们从TLB中移除是有意义的。此外,在实时系统中,TLB未命中或缓存未命中可能会引入一些不必要的不可预测性。因此,有一个选项可以锁定若干个TLB条目。主TLB有更多的条目,但只有其中的8个是可锁定的。


感谢您详细介绍了ARM ASID是什么。它似乎类似于旧的domainsPID - artless noise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接