2017-02-18 8 views
4

私はブート時にページテーブルの初期化についてLinuxのソースコード(4.4.45、他のバージョンと同じであるはずです)を読んでいます。下のコードは私を混乱させています。なぜLinuxカーネルのこのコードはデッドループを起こさないのですか?

具体的には、early_level4_pgtがどのように初期化されたかについて読んでいます。ここにコードの一部はx86_64link 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エントリにアクセスすると、ハンドラはスタートアップコードの残りの部分を処理します。しかし、私はそれについてはわかりません、そして、私は対応するコードを見つける場所を知らない。

誰かに私に手がかりを与えてもらえますか?どんな助けもありがとうございます。

答えて

2

https://stackoverflow.com/a/27353169/2422527

jmp 1f(この命令の後)1前方にラベルを付けるためにジャンプを意味します。

jmp 1bは、ラベル1(この指示の前に)にジャンプすることを意味します。

したがって、jmp 1fというラベルは、ラベルの末尾に1にジャンプし、デッドループは発生しません。

+0

ありがとう、私は彼らの違いを気付かなかった。 –

関連する問題