【问题标题】:Why is this piece of code in linux kernel NOT causing dead loop?为什么linux内核中的这段代码不会导致死循环?
【发布时间】:2017-07-07 21:47:28
【问题描述】:

我在看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 条目时,处理程序将处理其余的启动代码。但是我不确定,也不知道在哪里可以找到对应的代码。

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

【问题讨论】:

    标签: linux memory-management linux-kernel boot page-fault


    【解决方案1】:

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

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

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

    所以jmp 1f这一行跳转到标签1之后,不会造成死循环。

    【讨论】:

    • 谢谢,我没有注意到它们的区别。
    猜你喜欢
    • 2020-08-20
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多