ARM Linux カーネルのブート プロセスに関するコードを数日間読んだ後、関数のいくつかのトリッキーな部分を除いて、それらのほとんどを理解しました。__turn_mmu_on:
.align 5
__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
ENDPROC(__turn_mmu_on)
最後の命令mov pc, r13
は、次のように に分岐し__mmap_switched
ます。
__mmap_switched:
adr r3, __switch_data + 4
....
- 32 バイト (キャッシュ ラインのサイズ) 境界で整列する必要があるのはなぜですか?
r3
レジスタは単に命令で上書きされるため、ID レジスタの値を読み取る目的は何adr r3, __switch_data + 4
ですか(その値は使用されていません) 。