부팅 할 때 페이지 테이블 초기화에 대한 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 항목을 방문하면 처리기가 나머지 시작 코드를 처리합니다. 그러나 나는 그것에 대해 확실하지 않고 해당 코드를 어디에서 찾을 지 모른다.
누구나 내게 단서를 줄 수 있습니까? 어떤 도움을 주셔서 감사합니다.
감사합니다. 나는 그 차이점을 알지 못했습니다. –