4
我正在閱讀關於引導時頁表初始化的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項時,處理程序將處理其餘的啓動代碼。但我不確定,我不知道在哪裏找到相應的代碼。
任何人都可以給我一些線索嗎?任何幫助表示讚賞。
謝謝,我沒有注意到它們的區別。 –