1

这个问题与一段引导代码有关,您可以在__common_mmu_cache_on.

1:              mcr     p15, 0, r0, c1, c0, 0   @ load control register
                mrc     p15, 0, r0, c1, c0, 0   @ and read it back to
                sub     pc, lr, r0, lsr #32     @ properly flush pipeline

第一条指令打开 mmu。

由于 3 级流水线,接下来的两条指令可能已被预取。所以我想知道是否sub pc, lr, r0, lsr #32被视为两个单独的指令?如果没有,为什么不重写它,sub pc, lr因为r0, lsr, #32什么都不做。

4

1 回答 1

0

不像那样,杰克已经给了你大部分答案。

作者试图阻止指令同时执行。由于第二条和第三条指令之间的 RAW 依赖关系,它们不能同时执行。这大概就是作者的本意。杰克

对,它是一种同步指令。

相比之下,请注意如何__armv7_mmu_cache_on在同等位置使用 ISB。不是这样的

也是正确的,但是__armv7_mmu_cache_on会弄清楚我们正在运行的 CPU。此代码(在 head.S 中)在 ARMv4-v5 上运行。在ISBARMv4-v5 上会出错。使用合成数据依赖项代替,ISB因此代码可以在这些 ARM CPU 上执行。

所以我想知道是否sub pc, lr, r0, lsr #32被视为两个单独的指令?如果没有,为什么不重写它,sub pc, lr因为r0, lsr, #32什么都不做?

您是正确的,这r0, lsr #32对计算返回地址没有任何作用。由于数据相关性,CPU 可能不会在打开 MMUlr之前预先确定返回地址并预取返回码。mcr它有效地用作ISB类型指令(但它可以被ARMv4 CPU使用)。代码从armv4_mmu_cache_on和调用__fa526_cache_on。在所有 ARM CPU 上,mcr指令可能在协处理器实际激活代码之前完成。因此 CPU 可能已发出打开 MMU/Cache 的指令,但这可能在几个 CPU 周期内都不会生效。人们通常会放入NOPs此代码路径,但这是较少的指令。

于 2014-12-28T17:24:52.793 回答