我希望在ARMv7架构的引导程序(裸机)期间禁用内存管理单元。读到手臂的时候,我偶然发现了这个。
“当MMU被禁用时,如果满足以下条件之一,则可以获取指令:
·指令与程序的简单顺序执行所需的指令位于相同的4KB内存块(对齐到4KB)中,或者位于紧跟此类块之后的4KB内存块中。
·指令位于相同的4KB内存块(对齐到4KB)中,之前在禁用MMU的情况下,程序的简单顺序执行需要该块中的指令,或者该指令位于紧随此类块之后的4KB块中。
有人愿意解密并向我解释如何确保指令彼此相邻在4KB/8KB以内吗?(这就是我对声明的理解。)
发布于 2013-09-18 00:08:55
我认为这意味着您不能向前跳转超过(8 KiB减去当前页面偏移量),也不能向后跳转到前4个KiB页面。基本上:线性程序流是可以的,向前跳转大约4 KiB也是可以的;向后跳转(和循环)只有在它们被保证不跨页面时才是可以的。
如果你使用C语言,你可能会教你的C编译器使用短跳跃模型;如果你直接使用汇编,这是相当容易做到的。还可以使用链接器脚本或直接转换为二进制输出格式,以确保在加载的内存地址与您认为在开发期间加载的内存地址匹配。
许多汇编程序都支持跳转的偏移量计算。你也可以生成一个所有符号的链接地图,然后分析你的跳跃不是太大。
当然,看看BSD和Linux是如何做到这一点的可能会被证明是有用的。我猜他们只是快速启用MMU,并且在此之前使用很少的手写代码。
发布于 2013-09-18 09:30:54
如果添加上下文的其余部分,则会看到
这些访问可能是由推测性指令提取引起的,而不管预取的指令是否已提交以供执行。
注意:为确保体系结构合规性,软件必须确保同时满足以下两个条件:
当禁用MMU时将执行的指令位于地址空间的4KB块中,该地址空间块仅包含可容忍推测性访问的存储器
紧跟在4KB块之后的地址空间的每个4KB块也仅包含容忍推测性访问的存储器,该4KB块保存当MMU被禁用时将执行的指令。
他们所说的就是分支预测器可能拉取指令的位置,无论是否使用。因此,如果您关闭了MMU,并且您在ram末尾附近执行,而您的内存控制器将不能容忍超过ram末尾的读取(读取)。那么你可能会有问题。要么不要运行关闭的代码,要么更改内存控制器以提高容忍度,要么打开mmu并容忍它的细微差别,无论它们是什么。(在mmu打开的情况下,您可以更容易地将下一个块映射到其他ram,因为您知道您实际上不会在那里执行,而只是作为分支预测器获取的填充)。
你如何为这个投保呢?简单地告诉链接器不要将代码放在那里,如果.text太接近,它将发出警告和/或失败。
https://stackoverflow.com/questions/18853677
复制相似问题