2

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ですか(その値は使用されていません) 。
4

1 に答える 1