系统相关
首页 > 系统相关> > 为什么linux内核中的这段代码不会导致死循环?

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

作者:互联网

我正在阅读关于启动时页表初始化的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条目时,处理程序将处理其余的启动代码.但我不确定它,我不知道在哪里可以找到相应的代码.

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

解决方法:

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

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

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

因此,行jmp 1f跳转到标签1之后,不会导致死循环.

标签:memory-management,linux,linux-kernel,boot,page-fault
来源: https://codeday.me/bug/20190701/1351041.html