我正在阅读关于启动时页表初始化的linux源代码(4.4.45,但在其他版本中应该是相同的),下面的代码让我很困惑。
具体来说,我正在阅读有关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条目时,处理程序将处理其余的启动代码。但我不确定,我也不知道在哪里可以找到相应的代码。
有人能给我一些线索吗?任何帮助表示赞赏。
答案 0 :(得分:2)
https://stackoverflow.com/a/27353169/2422527
jmp 1f
表示跳转到标签1
前进(在此说明之后)。
jmp 1b
表示向后跳转到标签1
(在此指令之前)。
所以行jmp 1f
跳转到标签1
之后,不会导致死循环。