我希望在ARMv7架构的引导程序(裸机)期间禁用MMU。 阅读ARM ARM我偶然发现了这一点。
“禁用MMU时,如果满足下列条件之一,则可以获取指令:
•指令位于相同的4KB内存块中(对齐到4KB)作为指令 通过简单的顺序执行程序所需,或者在4KB的内存块中 紧接着这样一个街区。
•指令与指令所在的4KB内存块(对齐为4KB)相同 以前需要通过MMU禁用的简单顺序执行程序, 或者紧跟在这样一个块之后的4KB块中。“
任何人都要解密并向我解释如何确保指令在彼此相邻的4KB / 8KB之内? (这就是我理解陈述的方式..)
答案 0 :(得分:1)
我认为这意味着您可能不会向前跳跃超过(8 KiB减去当前页面偏移量),而不会向后跳转到之前的4 KiB页面。基本上:线性程序流程正常,前向跳跃大约4 KiB;如果保证不跳过页面,则向后跳转(和循环)是可以的。
如果你使用C,你可以教你的C编译器使用短跳模型;如果你直接使用汇编,这很容易做到。还可以使用链接描述文件或直接转换为二进制输出格式,以确保加载的内存地址与开发期间加载的思考的内存地址相匹配。
许多汇编程序支持对跳转进行偏移计算。您还可以生成所有符号的链接图,然后分析您的跳转不是太大。
当然,看看BSD和Linux如何做到这一点可能会证明是有用的。我猜他们只是快速启用MMU并使用少量手写代码直到那时。
答案 1 :(得分:1)
如果您添加其余的上下文,那么您会看到
这些访问可能是由推测性指令提取引起的,无论如何 是否提交了预取指令 执行。
请注意 为确保架构合规性,软件必须确保两者兼顾 以下适用:
禁用MMU时将执行的指令是 位于地址空间的4KB块中,仅包含内存 这是容忍投机访问的
紧随其后的地址空间的每个4KB块 一个4KB的块,保存将在MMU执行时执行的指令 disabled也只包含容忍推测的内存 访问。
他们所说的只是分支预测器可能会提取指令,无论是否使用。因此,如果您关闭MMU并且在ram的末尾执行,并且您的内存控制器将不会容忍在该ram结束之后的读取(提取)。那么你可能有问题。要么不运行关闭或更改内存控制器的代码以更宽容,要么开启mmu并容忍其细微差别,无论它们是什么。 (使用mmu你可以更容易地将下一个块映射到其他ram知道你实际上不会在那里执行,但就像分支预测器的提取器一样)。
你如何投保?简单地告诉你的链接器不要把代码放在那里,如果.text太靠近它会发出警告和/或失败。