전원 버튼을 누르는 것부터 전체 기계 시작 과정을 이해하려고 노력하고 있습니다. 부트로더부터 initramfs 단계까지 제가 잘 이해하지 못하는 다른 작은 부분도 있습니다.
최근 Ubuntu 기본 설치에서 가져온 항목의 Grub 구성을 고려하면 다음과 같습니다.
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 96fb7310-5adb-4f66-bf59-04acd08d76a3
echo 'Loading Linux x.y.z ...'
linux /vmlinuz-x.y.z root=/dev/mapper/some-device-name ro nomodeset
echo 'Loading initial ramdisk ...'
initrd /initrd.img-x.y.z
이것이 실제로 시스템 상태와 메모리에 어떤 영향을 미치나요? 나는 Grub의 임무가 "커널을 로드하고 실행"하는 것이며 장치(또는 네트워크)의 파일에 액세스하여 이를 가져오는 자체 모듈 세트를 가지고 있다는 것을 알고 있습니다. 여기에 insmod
있는 예에서는 set root
및 search
- 그러나 이는 Grub의 관점일 뿐이며 커널과 공유되지 않습니다. 그렇죠?
나는 또한 Grub이 커널(복사?)을 메모리에 로드하고 있다고 추측합니다(linux
주문하다) 실행에 들어갑니다. (분명히 두 가지 다른 단계 - 그래서, 어떻게?) 주어진 인수는 커널에서 읽고 해석될 수 있으며(이것은 메모리 어딘가에 매핑된 큰 문자열입니까?) 요청된 옵션을 정렬하는 방법을 제공합니다.
initrd
이 옵션도 보입니다 . 이는 지정된 실제 루트 장치를 부팅하는 데 필요한 gzipped initramfs를 가리킵니다 root=
. 하지만 이 initramfs는 어떻게 커널에 제공됩니까? 로드할 수 있는 메모리 주소를 전달하지 않으며, 커널이 시작되기 전에 로드되기 때문에 자체적으로 액세스할 수도 없습니다. 일부 커널 문서에는 이 initramfs 파일 시스템 "장치"가 액세스 가능하다고 나와 있지만 /dev/ram0
어떻게 이것이 액세스 가능한 장치 파일이 되는지 모르겠습니다. 물속에는 내가 볼 수 없는 무슨 일이 벌어지고 있는 것 같아요.
또한 이것이 U-boot/Coreboot 사용과 같은 다른 부트로더(임베디드 플랫폼 포함)와 어떻게 관련되는지 이해하지 못합니다. Grub과 동일한 작업을 수행합니까(동일한 표준 메모리 주소?)? 커널/initrd 로딩 측면에서 Grub과 어떻게 비교됩니까?
내 질문을 명확히 하기 위해 시작 단계가 다른 이유와무엇변신했는데 안보이네요어떻게어떻게 발생하며 각 단계의 정확한 책임은 무엇입니까? 나는 "표준"을 놓치고 있다는 느낌을 갖고 있으며 모든 것이 이것으로 귀결됩니다.
이에 대한 설명이 있기를 바랍니다.
답변1
부트로더는 initrd를 메모리 어딘가에 저장하고 커널에 initrd 이미지의 메모리 주소를 알려줍니다. 대부분의 최신 Linux 시스템에서는파일 시스템 초기화구성표 사용법델라쿠르, 이는 실제로 실행 직후 커널에 의해 생성된 tmpfs 파일 시스템에 압축이 풀린 cpio 아카이브(디스크 이미지가 아님)입니다.
답변2
일반적으로 파일을 메모리에 로드하고 특정 위치로 점프하는 것만으로는 충분하지 않기 때문에 일종의 프로토콜이 있어야 하지만 커널 매개변수와 같은 다른 매개변수를 전달해야 합니다.DOS에서 메모리 디스크 매개변수에 액세스.
이는 하드웨어에 따라 다르므로(예: arm은 x86과 다름) 올바른 정보를 찾아야 합니다.가이드 암에 관한 이 기사또는Linux/x86 부팅 프로토콜몇 가지 예를 들어보세요.