私はブート時にページテーブルの初期化についてLinuxのソースコード(4.4.45、他のバージョンと同じであるはずです)を読んでいます。下のコードは私を混乱させています。なぜLinuxカーネルのこのコードはデッドループを起こさないのですか?
具体的には、early_level4_pgt
がどのように初期化されたかについて読んでいます。ここにコードの一部はx86_64、link is hereです。
leaq level2_kernel_pgt(%rip), %rdi
leaq 4096(%rdi), %r8
/* See if it is a valid page table entry */
1: testb $1, 0(%rdi)
jz 2f
addq %rbp, 0(%rdi)
/* Go to the next page */
2: addq $8, %rdi
cmp %r8, %rdi
jne 1b
/* Fixup phys_base */
addq %rbp, phys_base(%rip)
movq $(early_level4_pgt - __START_KERNEL_map), %rax
jmp 1f
ENTRY(secondary_startup_64)
(below is omitted...)
1:
から始めて、流れはどんな2:
に行くんだろう。 2:
の内部では、何があってもフローは1:
に戻るでしょう!
私は本当に混乱していますが、このループはどのように終了し、カーネルはいつsecondary_startup_64
と入力しますか?私の推測では、ページフォールトを引き起こす無効なpmdエントリにアクセスすると、ハンドラはスタートアップコードの残りの部分を処理します。しかし、私はそれについてはわかりません、そして、私は対応するコードを見つける場所を知らない。
誰かに私に手がかりを与えてもらえますか?どんな助けもありがとうございます。
ありがとう、私は彼らの違いを気付かなかった。 –