为什么linux内核中的这段代码不会导致死循环?

我正在阅读关于引导时页表初始化的linux源代码(4.4.45,但应该与其他版本相同),下面的代码使我困惑。

具体来说,我正在阅读有关early_level4_pgt是如何初始化的。 这里是x86_64代码的一部分, 链接在这里 。

  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:开始,stream量将变为2:无论如何; 而在里面2: :,stream量会跳回1:不pipe怎样!

我真的很困惑,这个循环是如何结束的,内核什么时候进入secondary_startup_64 ? 我的猜测是,当它访问导致页面错误的无效pmd项时,处理程序将处理其余的启动代码。 但我不确定,我不知道在哪里find相应的代码。

谁能给我一些线索? 任何帮助表示赞赏。

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

jmp 1f表示跳转到标签1向前(在此指令之后)。

jmp 1b表示向后跳转到标签1 (在此指令之前)。

所以行jmp 1f跳转到标签1之后,不会导致死循环。