【发布时间】:2013-01-22 14:22:53
【问题描述】:
为 ARMv7 (Cortex-a8) 编译的 Linux 内核 2.6.34.3
我查看了内核代码,看起来 Linux 内核在 TTB1(转换表库)上为内核地址空间(0xC0000000 以上的所有内容)和 ttb0(0xC0000000 以下的所有内容)上的用户进程设置了硬件页表,每个进程上下文切换都会发生变化。它是否正确?我仍然很困惑 MMU 如何知道要查看哪个 ttb 进行翻译?
我读到 TTBCR(转换表基本控制寄存器)确定当未找到 MVA 时要遍历哪个 ttb 寄存器,但是该寄存器始终读取 0,这意味着始终使用 ARM 体系结构参考手册中的 TTBR0。这怎么可能?谁能向我解释一下 Linux 内核是如何使用这两个 ttb 的?
我从这个站点https://www.cs.rutgers.edu/~pxk/416/notes/10-paging.html 阅读了 ttb 的工作原理,但我仍然不明白内核如何使用这两个 ttb
(再次检查内核代码,由于某种原因,ttb0 和 ttb1 都已设置,但似乎从未使用过 ttb1,我将 TTB1 寄存器设置为 0,Linux 内核继续照常运行)
【问题讨论】:
-
在你附上的链接上,
TTBR0 will still contain the memory map for the operating system and memory-mapped I/O.,我猜他们的意思是说TTBR1 will still contain the memory map for the operating system and memory-mapped I/O.,这对 3G/1G (2G/2G) 内存拆分更有意义。TTBR0将地址从 0 的进程 AS 映射到 0xbfffffff,TTBR0在每次进程切换期间切换。TTBR1永远不会被修改,因为它包含指向内核 AS 的链接(在具有 3G/1G 拆分的 Linux 上从 0xc000000 开始)。 -
感谢您的回复,那么对于每张桌子行走,硬件仅使用 TTB0 是否正确?硬件不使用TTBCR来确定要走哪个ttb寄存器?那么TTB1只用于将OS页面复制到进程页面?
标签: linux-kernel operating-system arm