mcr p15, 0, r5, c3, c0, 0 @ load domain access register
mcr p15, 0, r4, c2, c0, 0 @ load page table pointer
b __turn_mmu_on
.align 5
.type __turn_mmu_on, %function
__turn_mmu_on:
mov r0, r0
mcr p15, 0, r0, c1, c0, 0 @ write control reg
mrc p15, 0, r3, c0, c0, 0 @ read id reg
mov r3, r3
mov r3, r3
mov pc, r13
为什么有nop指令?只需等待previous指令完成即可
mcr p15, 0, r5, c3, c0, 0 @ load domain access register
mcr p15, 0, r4, c2, c0, 0 @ load page table pointer
但是分支指令会刷新管道中剩余的指令吗?那么 nop (mov r0, r0) 的建议是什么?
mov r0, r0
就像 nop 一样,它什么也不做。如果我删除代码,会发生什么?mmu 会正常工作吗?
最初的 ARM mmu 代码有一个“死亡之舞”。 这个问题中还有更多详细信息。
nop
指令是“时间”填充,以确保MMU在分支指令之前实际打开。在代码更新的情况下可以使用 isb
。然而,MMU正在改变指令空间,但这种改变超出了CPU的范围。
__turn_mmu_on
对于多个 ARM CPU 是通用的,实际打开 MMU 和 mcr
指令的延迟可能会有所不同。最初的 mov r0,r0
可以用于后续指令的对齐。当你有疑问的时候,你可以问git。 git blame head.S
...
00945010c063b(拉塞尔·金2010-10-04 17:56:13 +0100 501)mov r0,r0
在我的变体中,还有一个“instr_sync”。此提交是由于副本所致。如果你遵循它,它将进入 Linux 的初始 git 提交。
我们也有这个问题,其中需要考虑 XScale。
如果我删除代码,会发生什么? mmu 会很好用吗?
谁知道呢?这取决于特定的CPU。 Linux 代码经过精心设计,可与各种 ARM CPU 配合使用,包括一些非常古老的 2000 年之前的设计。如果删除其中之一,您可能会损坏它。
可以肯定的是,MMU 会工作得很好。它可能只会使您的代码崩溃并使您的设备变砖,或者您将成为英雄并节省四个字节的代码。