linux-kernel – Linux内核ARM转换表库(TTB0和TTB1)

前端之家收集整理的这篇文章主要介绍了linux-kernel – Linux内核ARM转换表库(TTB0和TTB1)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
针对ARMv7编译的 Linux内核2.6.34.3(Cortex-a8)

我查看了内核代码,看起来Linux内核为TTB1(转换表基础)上的内核地址空间(一切都超过0xC0000000)和ttb0上的用户进程(0xC0000000下的所有内容)设置了硬件页表,进程上下文切换.它是否正确?我仍然很困惑MMU如何知道翻译的哪个ttb?

我读到TTBCR(转换表基本控制寄存器)确定在找不到MVA时要走哪个ttb寄存器,但是寄存器总是读为0,这意味着始终在ARM体系结构参考手册中使用TTBR0.怎么可能?任何人都可以向我解释Linux内核如何使用这两个ttbs?

我读了ttb如何从这个站点https://www.cs.rutgers.edu/~pxk/416/notes/10-paging.html工作,但我仍然不明白内核如何使用这两个ttbs

(仔细检查了内核代码,由于某种原因ttb0和ttb1都已设置,但似乎从未使用过ttb1,我将TTB1寄存器设置为0并且Linux内核继续像往常一样运行)

解决方法

TTBR寄存器一起用于确定完整32位或40位地址空间的寻址.哪个寄存器用于通过TTBCR中的tXsz位控制的地址范围.对应于TTBR0的t0sz和TTBR1的t1sz有一个条目.

每个TTBRx寄存器寻址的页表是独立的,但您通常会发现大多数Linux实现只使用TTBR0. Linux希望能够使用3G / 1G地址空间分区方案,ARM不支持该方案.如果查看“ARMv7体系结构参考手册”的B3-1345页,您会看到t0sz和t1sz的值分别决定了TTBR0和TTBR1支持的地址范围.为了增加对迷失方向的困惑,甚至可能有脱离的地址空间,其中TTBR0和TTBR1支持不连续的范围,从而导致系统地址空间出现漏洞.美好时光!

但是,为了回答您的主要问题,ARM建议使用TTBR0将偏移量存储到USER进程使用的页表中,并使用TTBR1将偏移量存储到KERNEL使用的页表中.我还没有看到实际执行此操作的单个实现.在所有情况下都使用TTBR0,TTBR1包含L1表的副本.

那怎么办? TTBR的值存储为过程状态的一部分,并且每次切换过程时都会简单地恢复.这就是它的工作方式.最初,TTBR1将为内核表保持一个常量值,永远不会被替换或换出,而每次上下文在进程之间切换时,TTBR0都会被更改.显然,ARM的大多数Linux实现决定基本上消除TTBR1的使用并坚持使用TTBR0来实现一切.

如果你想在你的设备上测试这个理论,试试whacking TTBR1并注意什么都没发生.然后尝试敲击TTBR0并观察系统崩溃.我还没有遇到一个没有产生完全相同结果的实例.简而言之,TTBR1对于Linux来说是无用的,而且TTBR0几乎只用于交换.

现在,一旦你获得LPAE支持,抛弃所有这些并重新开始.这是一个实现,你将开始看到t0sz和t1sz的值不是零,因此也是N.

猜你在找的Linux相关文章