부트로더는 실제로 어떻게 커널에 전달됩니까?

부트로더는 실제로 어떻게 커널에 전달됩니까?

kerneland 라인이 있는 initrd부트로더 가 있다고 가정해 보겠습니다 . 모든 의도와 목적을 위해 현재 2~3개의 "커널" 단계를 작업 중입니다.

  1. 펌웨어
  2. grub (또는 다른 부트로더)
  3. 실제 리눅스 커널

위의 내용은 MBR에 대한 것입니다. EFI의 경우 부트 로더(또는 부팅 관리자)는 펌웨어가 "커널"일 때 실행되는 EFI 응용 프로그램입니다.

  1. 펌웨어, EFI 애플리케이션 로드 중
  2. 실제 리눅스 커널

실제 커널 전환 프로세스는 무엇입니까? MBR 그럽은 2에서 3으로 변경하거나 EFI 펌웨어를 1에서 2로 변경하기 위해 실제로 무엇을 합니까? 와 비슷합니까 kexec?

둘째, EFI의 경우 일부 후크가 EFI 애플리케이션으로 전달된 다음 Linux 커널로 전달됩니다(efibootmgr과 같은 작업을 수행할 수 있음). 이는 어떻게 전달됩니까?

마지막으로, 이 작업을 여러 번 수행할 수 있습니까? 예를 들어 "일반" OS를 로드하기 전에 TPM 항목 측정 및 확인, 암호 해독 등과 같은 일부 사용자 지정 작업을 수행해야 하는 경우 grub, rEFInd 또는 기타 도구를 사용하여 쉽게 수행할 수 없는 작업일 수 있습니다. "임시" 단계 커널과 initrd를 로드하고 실행한 다음 넘겨줄 수 있나요?

답변1

주로 BIOS/GRUB 시스템에 관한 일부 참고 사항입니다.

GRUB를 사용하는 BIOS 시스템:

BIOS 부팅 시간주소0xfffffff0(x86).

POST 등 다양한 테스트를 수행합니다. 모든 것이 잘 진행되면 CMOS에 구성되고 저장된 순서대로 장치를 확인하십시오. 유효한 MBR(오프셋 510의 서명 0x55aa)이 있는 첫 번째 부팅 장치는 주소 메모리에 로드됩니다 0x7c00.

그런 다음 BIOS는 MBR의 오프셋에서 로드된 코드(바이트)에 제어권을 넘겨줍니다 0. 즉, 제어를 벗어나는 데이터는 프로세서 명령이어야 합니다. 프로그램.

예를 들어 MBR 이미지를 보면 eb6390처음과 비슷한 것을 발견할 수 있습니다. 이는 두 가지 기계 명령어로 변환됩니다.

eb63 => jump to 0x63 (offset 0x65 in MBR as count is from end of instruction)
90   => No Operation
  • boot.SGRUB 소스에서. 어셈블리 MBR의 첫 번째 명령은 다음과 같습니다.

    jmp LOCAL(after_BPB)
    nop
    

여기에서 GRUB는 다음 단계를 로드합니다. 일반적으로 첫 번째 섹터core.img

  • diskboot.S일반 디스크 부팅 시 GRUB 소스에서.

이 코드로 이동한 다음 로드하십시오 core.img. 여기에는 Reed-Solomon 오류 수정, 압축 해제 startup_raw.S등이 포함됩니다. 현재 GRUB는 모듈을 기반으로 하며, 모듈도 이 단계에서 로드됩니다.

GRUB 구성 파일을 읽고 실행할 커널을 결정하면 해당 /boot파일을 디렉터리에서 메모리로 로드합니다. 그런 다음 초기 RAM 디스크 이미지 initrd가 메모리에 로드됩니다.

또한 부트로더는 구성 문자열의 메모리 주소를 커널 메모리 공간에 씁니다. 즉, 시작 옵션입니다. 바라보다헤더 필드두드러진"조정".

또한 부트로더는 일반적으로 로딩 단계에서 리얼 모드와 보호 모드를 번갈아 가며 사용됩니다. 이를 통해 1MB 제한을 초과하는 데이터를 로드할 수 있습니다.

이 작업이 완료되면 BIOS가 MBR을 통해 부트로더에 제어권을 맡기는 것처럼 부트로더는 제어권을 커널에 넘겨줍니다. 이것은 리얼 모드에서 수행됩니다.

커널은 (보통) 모듈 기반입니다. 예를 들어 이러한 모듈 중에는 파일 시스템 모듈이 있습니다. 부팅 시 커널은 파일 시스템에서 파일을 읽어야 할 수 있으며, 이를 읽으려면 모듈이 필요합니다. 이것이 바로 initrd이것이 작용하는 부분입니다. 시작하는 데 필요한 모듈은 여기에 있습니다.

(유)EFI:

(U)EFI 부팅 프로세스할 수 있는uefigrub 설치 등을 사용하는 경우 BIOS/GRUB와 동일한 트랙에 있는 것입니다. 당신은 또한 사용하도록 선택할 수 있습니다EFI 부트 스텁이를 통해 EFI 펌웨어는 커널을 EFI 실행 파일로 로드할 수 있습니다.

더 멀리,커널 3.14부터 시작, kexec도 사용할 수 있지만 콜드 스타트에는 사용할 수 없습니다.

관련 정보