为什么要在__turn_mmu_on中添加nop指令?

问题描述 投票:0回答:1
        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 会正常工作吗?

linux-kernel arm kernel
1个回答
0
投票

最初的 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 会工作得很好。它可能只会使您的代码崩溃并使您的设备变砖,或者您将成为英雄并节省四个字节的代码。

© www.soinside.com 2019 - 2024. All rights reserved.