ARM11 Translation Lookaside Buffer(TLB)用法?

时间:2012-01-24 18:49:34

标签: arm tlb armv6

是否有一个体面的指南解释如何在 ARM1176JZF-S 核心上使用TLB( Translation Lookaside Buffers )表?

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

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

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

提前谢谢。如果有人提供TLB的解释,我会很高兴的。我正在为我的内核开发一个内存映射器,而且我几乎已经走到了尽头。

1 个答案:

答案 0 :(得分:15)

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

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

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

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

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

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

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

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

这正是出于同样的原因,您为指令和数据提供了小的单独的1级缓存。由于它们是缓存,因此需要超过10个(尽管有更多可以提高性能)。

它表示主TLB的一个部分是“一个可锁定的八个元素的完全关联数组”。那是什么?我只有8个主TLB条目?

经常访问某些内存页面(例如:内核的某些部分)。锁定它们是有意义的,因此它们不会被TLB抛弃。而且,在实时系统上,TLB未命中或高速缓存未命中可能引入一些不希望的不可预测性。因此,可以选择锁定多个TLB条目。主TLB有更多条目,但只有8个是可锁定的。