Я читаю исходный код linux (4.4.45, но должен быть таким же в другой версии) об инициализации таблицы страниц при загрузке, а приведенный ниже код меня смутил.Почему эта часть кода в ядре linux не вызывает мертвого цикла?
В частности, я читаю о том, как инициализируется 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, которая вызывает ошибку страницы, обработчик будет иметь дело с остальной частью кода запуска. Но я не уверен в этом, и я не знаю, где найти соответствующий код.
Может ли кто-нибудь дать мне несколько подсказок? Любая помощь приветствуется.
Спасибо, я не заметил их разницы. –