Linux x86_64의 부팅 단계를 알고 싶고 일부 기사를 읽고 linux-3.14.65/Documentation/x86/boot.txt
실행해야 할 첫 번째 지침이 거의 알고 싶지만 다음 내용에 대한 설명을 vmlinux
보면 다음과 같습니다.startup_x86
arch/x86/kernel/head_64.S
startup_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_64
from으로의 점프가 발생할 수 있습니다 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 파일도 이러한 제어 레지스터를 사용합니다.