请参阅http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211k/Bihgfcgf.html
对于 ARM5 及更低版本,TTB 表的大小和对齐方式是固定的(至 16k)。每个级别 1 条目代表 1MB。表项为 32bits (16k*1M/(32bit/8) = 4GB)。TTBCR控制TTBR0表的大小。从上面的网址,
选择使用哪个转换表基址寄存器
转换表基址寄存器的选择如下:
如果 N = 0,则始终使用转换表基址寄存器 0。
- 这是复位时的默认情况。它向后兼容 ARMv5 或更早的处理器。
如果 N 大于 0,则:
- 如果虚拟地址的位 [31:32-N] 全部为 0,则使用转换表基址寄存器 0,否则使用转换表基址寄存器 1。
所以TTBR0的大小也设置了内存分割。对于传统的Linux 3G/1G 1G/3G,应该选择值2 。4kB 表 == 1G 内存 == 位 31..30 为零。对于6的值,该表是 256byte == 64MB == 位 31..26 为零。
在 Linux 用语中,这些是页面全局条目(这会拆分此页面全局目录)。这些条目可以指向另一个表或只是一个 1MB段。下一个表条目是页面中间Linux 目录,然后是最后的页表条目。我认为页面中间条目在 ARM 上未使用。
MMU 硬件并非每次都走在桌子上。有一个 TLB(翻译后备缓冲区)。它就像 MMU 表的缓存。当操作系统更新这些表时,必须刷新 TLB,否则处理器将使用过时的条目。同样,ARM 缓存是虚拟标记的,因此更改映射也可能意味着必须刷新缓存。由于这些原因,您永远不想在上下文切换时更改内容。共享库文本(比如libc.so)在上下文切换时应该相同。希望每个进程都有 libc.so 映射到相同的虚拟地址。这样做有很大的收获;较低的内存使用和良好的 I-cache 使用。
域和PID寄存器以及主管/用户模式也可以控制内存访问。这些是可以在上下文切换上切换的单个寄存器。
有关ARMV5 上的 PID 和域使用的信息,请参阅http://lwn.net/images/conf/rtlws11/papers/proc/p01.pdf 。当前的 Linux 源代码与论文描述的不完全一样。Linux 完全有可能不需要使用这种机制并将TTBCR设置为零,以便 ARM 子架构的 VM 代码类似。
编辑: 我不相信TTBCR功能可用于实现 3G/1G 拆分。我认为 Rutger 的页面是在泛泛地讨论TTBCR,而不是在Linux上下文中。此外,至少2.6.38 Linux 使用域或DACR,但不使用pid或fcse,因为它支持有限数量的进程。
http://lwn.net/Articles/106177/ - 在罗格斯页面上也有引用。