how kernel start

항상 헷갈리는 개념이다. 바로 리눅스 커널 (운영체제)가 어떻게 시작이 되냐 인데

깔끔하게 정리를 하자면,

  1. 부트로더(GRUB/EFI) 가
    • 커널 이미지(bzImage/vmlinuz)와
    • initramfs(initrd/initramfs)를 RAM에 올림
  2. 커널이 시작되면서
    • 커널 본체가 자기 자신을 압축해제하고
    • 드라이버/메모리/스케줄러 등 커널 초기화를 진행
  3. initramfs가 있으면 커널은 그걸 임시 루트(/)로 삼고
    • 보통 initramfs 안의 /init (스크립트/바이너리)를 PID 1로 실행
    • 이 /init이 BusyBox 기반일 수 있음(“busybox initramfs”)
    • initramfs , buzybox에 대한 자세한 내용은 → what is initramfs & buzybox
  4. /init이 실제 루트 장치를 준비/마운트한 다음
    • 루트를 real rootfs로 바꾸고(switch_root/pivot_root)
    • real rootfs의 /sbin/init 를 exec해서 넘김

즉, 커널이 시작하는 시점은 bzImage가 압축해제 되어 실행이 되는 순간이다.

이때 부터 각각의 모듈, 커널 코드들이 실행되고,

기본적인 커널을 제외한 서비스, 네트워크, 셸이 /sbin/init 이 실행되면서 시작이 된다.

조심할내용 )

주로 initramfs 파일시스템 내에 init 파일 하단에

C
mount /dev/sda2 /newroot
exec switch_root /newroot /sbin/init

다음과 같은 코드로 루트 파일시스템을 바꾸면서 넘어감

근데 조심을 해야할게

C
exec /sbin/init "$@"

이런식으로 바로 initramfs 파일시스템 안에 있는 /sbin/init을 시작할때도 있는데

이때는 이 initramfs 파일시스템을 기본 시스템으로 가볍게 사용하겠다. 이거임 기본 명령어들도 그냥 buzybox로만 사용하고

따라서 커널 문제를 풀기전에 이 initramfs 파일시스템의 init 파일을 보는 것도 상당히 중요하다.