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

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

我正在阅读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,不会导致死循环。

关于linux - 为什么 linux 内核中的这段代码不会导致死循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42313655/

相关文章:

php - 试图从 php 脚本 : returns a pid but doesn't execute 运行 python 脚本

C++ 内存管理说明

Docker 最低内核版本 3.8.13 或 3.10

Linux 内核模块 : Delayed workqueue make the kernel crashed

c - Makefile .o 文件规则问题

linux - 删除空行旁边一行的 Shell 脚本

php - 调用返回后,PHP 是否垃圾收集函数范围的对象?

process - 进程地址空间中每个共享库的附加文本、数据和 bss 部分,这是真的吗?

mysql - 比较同一组字符的加密值

android 在 View 删除时回收 View 中的所有位图