1

我希望在 ARMv7 架构的引导程序(裸机)期间禁用 MMU。阅读 ARM ARM 我偶然发现了这一点。

“当 MMU 被禁用时,如果满足以下条件之一,则可以获取指令:

• 该指令与程序的简单顺序执行所需的指令位于相同的 4KB 内存块(与 4KB 对齐)中,或者位于紧跟该块的 4KB 内存块中。

• 该指令位于相同的 4KB 内存块中(与 4KB 对齐),之前在禁用 MMU 的情况下简单顺序执行程序需要一条指令,或者位于紧跟该块的 4KB 块中。”

任何人都可以解密并向我解释我如何确保指令在彼此相邻的 4KB/8KB 范围内?(这就是我理解这些陈述的方式..)

4

2 回答 2

1

如果您添加上下文的其余部分,那么您会看到

无论预取指令是否已提交执行,这些访问都可能由推测性指令提取引起。

注意 为确保架构合规性,软件必须确保以下两项均适用:

禁用 MMU 时将执行的指令位于地址空间的 4KB 块中,其中仅包含允许推测性访问的内存

紧跟在一个 4KB 块之后的地址空间的每个 4KB 块,该块保存在禁用 MMU 时将执行的指令,也只包含允许推测性访问的内存。

他们所说的只是分支预测器可能在哪里提取指令,无论是否使用。因此,如果您关闭了 MMU,并且您在 ram 的末端附近执行,并且您的内存控制器将不会容忍超过该 ram 末端的读取(获取)。那么你可能会遇到问题。要么不运行关闭的代码,要么将内存控制器更改为更宽容,或者打开 mmu 并容忍其细微差别,无论它们可能是什么。(使用 mmu,您可以更轻松地将下一个块映射到其他 ram,因为您知道您实际上不会在那里执行,而只是作为分支预测器获取的填充)。

你如何保证这个?简单地告诉你的链接器不要把代码放在那里,如果 .text 太接近它会发出警告和/或失败。

于 2013-09-18T01:30:53.540 回答
1

认为这意味着您不能向前跳转超过(8 KiB 减去当前页面偏移量),也不能向后跳转到前一个 4 KiB 页面。基本上:线性程序流程是可以的,向前跳转大约 4 KiB 也是可以的;向后跳转(和循环)只有在保证不跨页的情况下才可以。

如果您使用 C,您可能可以教您的 C 编译器使用短跳转模型;如果你直接使用汇编,这很容易做到。还可以使用链接器脚本或直接转换为二进制输出格式,以确保您加载的内存地址与您认为在开发期间加载的内存地址相匹配。

许多汇编器支持对跳转进行偏移计算。您还可以生成所有符号的链接图,然后分析您的跳跃不是太大。

当然,看看 BSD 和 Linux 如何做到这一点可能会被证明是有用的。我猜他们只是快速启用 MMU 并且在那之前使用很少的手写代码。

于 2013-09-17T16:08:54.763 回答