ARM11 转换后备缓冲区 (TLB) 使用情况?

标签 arm tlb armv6

是否有一个不错的指南解释如何在 ARM1176JZF-S 内核上使用 TLB(转换后备缓冲区)表?

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

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

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

提前谢谢您。如果有人解释什么是 TLB,我将非常高兴。我目前正在为我的内核开发内存映射器,但我几乎陷入了死胡同。

最佳答案

ARM1176JZF-S 的技术引用手册似乎是 DDI 0301。该文档包含该特定 ARM 内核的所有具体详细信息。

I still have no clue what a TLB is or what it looks like. As far as I understand, each TLB entry maps a virtual page to a physical page, allowing remapping and controlling memory permissions.

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

What structure does a TLB entry have? How do I create new entries?

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

How do I handle VM in context switches for user-space threads?

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

Why are there two TLBs? What can I use the MicroTLB for if it can only have 10 entries? Surely, I need more than 10.

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

It says that one of the parts of the main TLB is "a fully-associative array of eight elements, that is lockable". What is that? Do I only get to have 8 entries for the Main TLB?

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

关于ARM11 转换后备缓冲区 (TLB) 使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8992338/

相关文章:

arm - 什么是 PDE 缓存?

iphone - 取消对 iPhone 3G 的支持

gcc - 使用gnueabihf为ARMv6构建

c - 在ARM Linux中,每个线程在内核堆栈的 "bottom"处保留的几个字节的目的是什么

linux - 'BL' arm指令反汇编如何工作?

multithreading - 操作系统尽量减少 TLB 刷新的难度有多大?

iOS:iPhone 3GS 或更年轻的设备是否需要 armv7?

c++ - ARM WINCE应用,反黑客解决方案

c - 哪个更好? 32 位 MCU 中的 int8_t 与 int32_t

cpu-architecture - 取指令流水线中是否使用了 TLB