2017-02-18 5 views
4

Я читаю исходный код 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, которая вызывает ошибку страницы, обработчик будет иметь дело с остальной частью кода запуска. Но я не уверен в этом, и я не знаю, где найти соответствующий код.

Может ли кто-нибудь дать мне несколько подсказок? Любая помощь приветствуется.

ответ

2

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

jmp 1f означает переход на метку 1 вперед (после этой инструкции).

jmp 1b означает переход на метку 1 назад (перед этой инструкцией).

Итак, линия jmp 1f прыжок на метку 1 после этого, не вызывая мертвой петли.

+0

Спасибо, я не заметил их разницы. –

Смежные вопросы