ID 매핑 페이지 테이블을 로드한 사람은 누구입니까?

ID 매핑 페이지 테이블을 로드한 사람은 누구입니까?

Linux x86_64의 부팅 단계를 알고 싶고 일부 기사를 읽고 linux-3.14.65/Documentation/x86/boot.txt실행해야 할 첫 번째 지침이 거의 알고 싶지만 다음 내용에 대한 설명을 vmlinux보면 다음과 같습니다.startup_x86arch/x86/kernel/head_64.Sstartup_64

    .text
__HEAD
.code64
.globl startup_64
startup_64:
/*
 * At this point the CPU runs in 64bit mode CS.L = 1 CS.D = 0,
 * and someone has loaded an identity mapped page table
 * for us.  These identity mapped page tables map all of the
 * kernel pages and possibly all of memory.

CPU runs in 64bit mode댓글이 아직도 헷갈립니다. 누가 게시 했는지 모르겠습니다 has loaded an identity mapped page table for us. 이것은 Grub? 내가 무엇을 놓치고 있나요?

답변1

startup_64입장 가능

/* The entry point for the PE/COFF executable is efi_pe_entry. */
ENTRY(efi_pe_entry)
...
    movl    BP_code32_start(%esi), %eax
    leaq    startup_64(%rax), %rax
    jmp *%rax
ENDPROC(efi_pe_entry)

또는 Linux 인식 EFI 부트로더가 handover_entry루틴 내부로 직접 이동할 수 있다고 생각합니다. efi_pe_entry이 하이브리드 접근 방식을 통해 부트 로더는 커널이 EFI 특정 기능을 사용할 수 있도록 하면서 일부 Linux 특정 기능을 계속 제공할 수 있습니다. 바라보다EFI 시스템의 부팅 프로세스(LWN.net).

마지막으로 startup_64from으로의 점프가 발생할 수 있습니다 startup_32. 이는 Linux 인식 BIOS 부트로더에 의해 커널이 로드될 때 발생합니다.

(글쎄, 한 가지 사례가 더 있습니다. 64비트 커널에 지점이 있고 efi32_stub_entry그 지점으로 점프 할 수 있습니다 startup_32. 저는 그것을 무시합니다. 어쨌든 32비트 EFI의 64비트 커널은 여전히 ​​실험적인 것으로 표시됩니다.)

startup_64위의 내용에 따르면 이것이 확실하지 않습니다.한 번실행할 첫 번째 명령입니다 vmlinux. 댓글에는 "64비트 부트로더에서 직접" 가져올 수 있다고 나와 있지만 저는 그런 사실을 알지 못합니다.

BIOS의 경우 startup_32초기 64비트 페이지 테이블("초기 4G 부팅 페이지 테이블")을 설정하고 물론 64비트 모드("긴 모드"라고도 함)로 전환하는 역할을 담당한다는 것을 분명히 알 수 있습니다.

EFI64의 경우 CPU는 이미 64비트 모드입니다. efi_pe_entry전화 make_boot_params()해서 efi_main()입력하세요 eboot.c. ( handover_entry전화만 걸면 됩니다 efi_main(). 이 경우에는 부트로더가 제공합니다 struct boot_params.) eboot.c페이지 테이블이 설정되지 않았습니다. 따라서 주석은 로드하는 커널의 모든 페이지(모든 페이지 포함)에 대해 최소한 EFI를 가정합니다.BSSspace), 그것은 나에게 의미가 있습니다 :-).

https://elixir.bootlin.com/linux/v4.20/source/arch/x86/boot/compressed/head_64.S

답변2

"페이지 테이블 초기화" 섹션의 첫 번째 글머리 기호에 따르면http://www.cse.iitd.ernet.in/~sbansal/os/lec/l14.html, Entry.S는 페이지 테이블 설정을 담당합니다. 우리는 논리를 찾았습니다https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S문제를 해결합니다("페이지 테이블이 다음과 같이 설정되었습니다...").

존재하다https://github.com/torvalds/linux/blob/v4.14/arch/x86/boot/compressed/head_64.S그러나 페이지 테이블 설정에 대한 더 많은 참조를 찾았습니다. 여기에는 "초기 4G 부팅 페이지 테이블 구축" 및 "부팅 페이지 테이블 활성화"가 표시됩니다.

이 문서에서는 ID 페이징을 포함하여 페이징을 활성화하는 방법에 대한 예를 제공합니다.https://github.com/littleosbook/littleosbook/blob/master/paging.md. 이 예에서는 다음에 설명된 대로 제어 레지스터 cr3, cr4 및 cr0을 사용합니다.https://en.wikipedia.org/wiki/Control_register. Entry_64.S 및 head_64.S 파일도 이러한 제어 레지스터를 사용합니다.

관련 정보