Linux 부팅 프로세스를 이해하려고 노력 중입니다.
내가 이해하는 바에 따르면 첫 번째 단계(GRUB에 의해 설정됨)에서 커널(압축된 이미지 파일)이 메모리에 로드되고 압축이 풀립니다.
제어가 커널로 전달될 때 이것이 실제로 어떻게 수행됩니까? 커널은 C 소스 코드에서 컴파일됩니까? 커널이 실제로 실행되는 방식.
이 기사를 읽었지만 내 질문에 대한 답변이 없는 것 같습니다.
답변1
커널은 C 소스 코드에서 컴파일됩니까? 커널이 실제로 실행되는 방식.
이 시점에서 커널 코드는 컴파일되어 프로세서에 직접 전달할 수 있는 형태입니다. 만약에이미지 파일 압축.JPG 또는 .GIF 파일과 같은 이미지를 참조하지 않습니다.메모리 이미지- 커널의 실제 기계어 코드를 1:1로 표현합니다(압축 해제 후).
구형 프로세서에서는 실제 명령 바이트가 단순히 프로세서 내부 논리 게이트의 하드웨어 매트릭스에 공급됩니다.명령어 디코더: 그런 다음 다른 게이트가 해당 특정 명령을 따르는 데이터 바이트를 프로세서의 필요한 부분에 전달하고 다른 필요한 작업을 트리거할 수 있습니다. 최신 프로세서에는 일반적으로 소프트웨어 제어의 추가 계층이 있습니다.마이크로코드프로세서의.
제어가 커널로 전달될 때 이것이 실제로 어떻게 수행됩니까?
이는 시스템의 펌웨어 + 아키텍처에 따라 다릅니다. 전통적인 x86 BIOS에서 펌웨어와 부트로더는 일반적으로 첫 번째 IBM PC/AT에서 원칙적으로 실행될 수 있는 16비트 코드입니다. 여기서 제어 전송은 본질적으로 부트로더 코드에서 커널로 실행되는 것입니다. 코드의 점프 명령 그리고 다시는 돌아오지 않습니다.
커널 코드의 첫 번째 부분에는 나머지 커널 코드의 압축을 풀고 BIOS에서 남긴 유용한 정보(그렇지 않으면 덮어쓰게 됨)를 얻고 프로세서를 전체 32비트 또는 64비트로 전환하는 압축 해제 루틴이 포함됩니다. 비트 모드. 이 과정에서 RAM의 부트로더 코드가 덮어쓰기될 수 있으므로 커널 코드에서 부트로더로 돌아가는 아이디어는 무의미해집니다.
UEFI 펌웨어가 있는 최신 PC에서 UEFI 사양에는 펌웨어/부트로더와 실제 운영 체제 간의 표준 전환 프로토콜이 포함되어 있지만 궁극적으로는 코드 블록(=펌웨어/부트로더)에서 시작하기 위해 프로세서가 점프 명령을 실행하게 됩니다. 프로그램)을 다른 블록(= 커널의 첫 번째 부분)으로 전송하고 반환할 의도가 없습니다.