【问题标题】:ARM MMU disabled 4KBARM MMU 禁用 4KB
【发布时间】:2013-09-17 15:18:07
【问题描述】:

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

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

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

• 指令与指令位于同一 4KB 内存块(对齐到 4KB)中 以前通过禁用 MMU 的程序的简单顺序执行需要, 或在紧跟这样一个块的 4KB 块中。”

有谁可以解密并向我解释如何确保指令在 4KB/8KB 范围内相邻? (这就是我对这些陈述的理解..)

【问题讨论】:

    标签: assembly arm mmu


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 一旦我了解我要解决的问题,我将研究短跳模型等。仅从文本很难理解这些限制。 @dwelch dwelch 可能在正确的轨道上
    • 啊,是的,他从一个完全不同的角度来讨论它:CPU通过预取等方式对内存(控制器)施加限制,因此系统设计人员必须让他们的系统能够支持这种操作CPU的模式。说得通。这与我的读法不同,但多亏了上下文,这听起来确实合理。
    【解决方案2】:

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

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

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

    禁用 MMU 时将执行的指令是 位于仅包含内存的地址空间的 4KB 块中 可以容忍推测性访问

    紧随其后的地址空间的每个 4KB 块 一个 4KB 的块,其中包含将在 MMU 运行时执行的指令 disabled 也只包含能容忍推测的内存 访问。

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

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

    【讨论】:

    • 我其实不明白 :-(。我的迷你系统由 64KB 的 ROM(我的程序运行的地方)和只有 16KB 的 sram 组成。分支预测已关闭。是否可以关闭预取?这是一个有点难以阅读的文本......
    • 需要关闭预取吗?如果您的 ROM 和 SRAM 允许推测性访问,则您无需执行任何操作。我认为这里的问题是 CPU 可以(尝试)从由 I/O 空间支持的地址读取,或者根本不由内存支持,并且当 MMU 被禁用时,正常的页面错误机制不是使用,因此这可能会使系统进入异常状态。也许尽早启用 MMU(在 ROM 的前 4K 或 8K 内)是可能的?
    • 只需阅读手册,问题与正在运行的代码附近的推测性读取有关,如果您的内存系统不能容忍这些读取,那么您的系统将失败。理想情况下,这是芯片设计问题而不是软件问题,但这取决于硅工程师。您当然可以对其进行测试,或者只是让您的代码远离不满意的内存空间。通常你会在 ram 的顶端有堆栈,并且可能在 rom 的顶端有数据,所以通常不会有问题。
    • 我会继续,因为“应该没问题”,但不要回答这个问题。感谢有用的 cmets!
    • arm 文档回答你的问题,我不明白这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2016-09-26
    • 2012-04-17
    相关资源
    最近更新 更多