2017-02-18 6 views
4

부팅 할 때 페이지 테이블 초기화에 대한 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 항목을 방문하면 처리기가 나머지 시작 코드를 처리합니다. 그러나 나는 그것에 대해 확실하지 않고 해당 코드를 어디에서 찾을 지 모른다.

누구나 내게 단서를 줄 수 있습니까? 어떤 도움을 주셔서 감사합니다.

답변

2

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

jmp 1f 점프 (이 명령어 이후에) 전진 1 라벨을 의미한다.

jmp 1b은 레이블 1으로 뒤로 이동한다는 것을 의미합니다 (이 지침 이전).

따라서 jmp 1f 레이블은 1 레이블로 점프합니다. 따라서 데드 루프가 발생하지 않습니다.

+0

감사합니다. 나는 그 차이점을 알지 못했습니다. –