2017-02-18 33 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

謝謝,我沒有注意到它們的區別。 –

相關問題