Kernel, Bootloader

부트로더가 하는 일은

  1. CPU 초기화
  2. IVT 초기화
  3. 하드웨어 초기화 및 커널 찾기 (외부 메모리 인터페이스 초기화 및 파일시스템 인식 과정)
  4. 커널을 메모리에 올리고 커널 Entry로 점프

인데, 여기서 부트로더가 커널을 메모리에 올릴때 어디에 어떻게 올리냐가 헷갈렸다.

컴파일 된 커널을 보면 relative 주소로 되어 있는데, 부트로더가 커널의 .data랑 .bss를 다른 프로세스처럼 적절한 곳에 따로 두는 걸로 착각했다. 당연히 부트로더 단계에서는 메모리 매핑이나 페이징이 아직 없고, 커널은 메모리에 매핑이 된게 아니라 고정된 주소에 있어야 한다.

커널은 PIC(Position Independant Code)인데, `.text`, `.data`, `.bss`가 정해진 offset 차이로 고정되어 메모리에 올라가기 때문에 동적 주소 매핑 없이 base address에 relative 하게 모든 section의 위치를 알 수 있다.

생각해보면 간단하고 당연한 거였다.

그리고 외부적 인터럽트나 시스템 콜 없이 프로세스가 context를 계속 잡고 있으면 다시 커널로 돌아올 방법이 없다. timed inturrupt나 watchdog이 필요하다.

* 부트로더 단계에서 MMU 초기화 하고 페이징 하는 복잡한 시스템이 아니라 임베디드 ARM 환경에서의 이야기다. UEFI나 모던 시스템에서는 다를거다.