레거시 BIOS(X86 아키텍처 고려)를 사용할 때 부트로더는 리얼 모드 커널의 위치(header.S 어셈블리 파일에 정의된 오프셋 512)로 점프하고 리얼 모드 코드를 시작합니다. 그런 다음 리얼 모드 코드는 스택과 힙을 준비하고 리얼 모드에서 다시 main.c로 점프합니다. UEFI 부팅 메커니즘은 어떻습니까? 아직도 리얼 모드 커널 코드를 사용하고 계십니까? 부트로더가 header.S의 동일한 부분으로 점프하고 리얼 모드에서 동일한 코드를 제어합니까? 보다 정확하게는 부트 로더가 운영 체제 코드로 점프할 때 커널을 초기화할 때 기존 BIOS 부팅과 UEFI 부팅의 차이점은 무엇입니까?
답변1
EFI 스텁 메커니즘을 사용할 때 리얼 모드 코드는 사용되지 않습니다. 펌웨어(머신이 부팅될 때 마더보드의 플래시 ROM에서 실행됨)는 커널 이미지를 로드하기 전에 프로세서를 보호 모드로 전환합니다. 커널 이미지 헤더는 UEFI 사양에서 요구하는 PE 실행 파일처럼 보이도록 구성됩니다. 자세한 내용은 다음을 참조하세요.이 인텔 기사.
편집하다:아래 댓글에 필요한 정보를 추가했습니다. 파일을 사용하게 만드는 진입점을 arch/x86/boot/header.S
포함합니다 CONFIG_EFI_STUB
. 펌웨어 호출은 헤더에 있습니다. 루틴 은 과 에 efi_pe_entry
있습니다 . 전자는 구조를 구성하고 명령줄에 지정된 경우 initramfs도 로드합니다. 커널 명령줄도 다르게 처리됩니다. UEFI도 이를 처리하지만 UEFI는 UCS-2 인코딩 문자열(유니코드의 하위 집합)을 사용하므로 ASCII로 변환됩니다. 두 가지 모두 EFI 스텁과 기존 부팅 방법 간에 공통적으로 사용되는 코드가 많이 포함되어 있습니다 .arch/x86/boot/compressed/head_64.S
make_boot_params
efi_main
arch/x86/boot/compressed/eboot.c
boot_params
header.S
head_64.S
시. UEFI는 언젠가 x86 프로세서의 리얼 모드에서 영구적으로 벗어날 수 있습니다. 최신 운영 체제를 부팅하는 데에만 사용됩니다.