BOBO's Note

Generic Boot Sequence 본문

Embedded System

Generic Boot Sequence

bobo_hee 2020. 5. 25. 23:32

Linux Boot Sequence

컴퓨터에 전원이 들어와 운영체제의 로그인 화면이 뜨기 전까지 여러 과정을 거치게 된다. 보통 다음과 같은 순서를 따른다.

Generic Boot Sequence

  1. 컴퓨터에 전원이 들어오면 ROM에 저장된 BIOS 코드를 실행시킨다. BIOS란, Basic Input/Output System의 약자로, 부팅에 필요한 다양한 주변 장치(예. CPU, RAM, 디스크, USB 장치 등)를 인식하고, I/O 및 동작을 확인하여 초기화한다. 그 후, stage 1 부트로더를 로드한다.

    • POST (Power On Self Test): 주변 장치의 상태 확인 및 초기화, 인터럽트, 메모리 범위, I/O 포트 등을 정리한다.

    • UEFI BIOS: Legacy BIOS를 대체하는 새로운 시스템으로, 2TB 이상의 디스크를 인식할 수 있고 MBR을 거치지 않고 Boot Manager로 바로 부팅되기 때문에 부팅 속도도 더 빠르다.

  2. stage 1 부트로더는 MBR에 저장되어 있다. MBR은 Master Boot Record의 약자로, 디스크 첫 섹터의 512 바이트이며 부트로더의 위치를 저장한다. stage 1 부트로더는 stage 2 부트로더를 로드한다.

  3. stage 2 부트로더는 커널 이미지(/boot/vmlinuz-[버전])를 메모리에 로드한다. x86 계열에서 많이 사용하는 부트로더에는 GRUB, LILO가 있고, ARM 계열은 U-Boot를 많이 사용한다.

    • 부트로더는 커널 이미지 외에도 initramfs 또는 initrd를 메모리에 로드한다. 둘 다 루트 파일 시스템을 메모리에 로드하기 위한 방법이다. 루트 파일 시스템과 커널이 초기에 동작(=루트 파일 시스템을 마운트)할 때 필요한 디바이스 드라이버 및 커널 모듈들을 이미지 형태로 저장해놓은 것이다.

    • initramfs는 모든 파일, 라이브러리, 환경 설정, 도구 등을 cpio 아카이브에 모아놓은 이미지이다. 커널이 initramfs를 감지하면 tmpfs를 만들고 이 파일 시스템에 initramfs 내용을 추출한다. 그 후, tmpfs에 위치한 /init 프로세스를 실행시킨다. init 프로세스 내에서 실제 루트 파일시스템으로 전환하고, 실제 루트 파일 시스템의 /sbin/init을 호출해 부팅 과정을 진행한다.

    • initrd(initial ramdisk)는 블럭 디바이스 형태로 인식되는 파일 시스템 이미지이다. /dev/ram으로 접근할 수 있고, 초기 루트 파일 시스템으로 마운트 된다. /sbin/init 프로세스를 실행시킨다. initrd는 고정 크기이고 메모리에 계속해서 상주하며 블럭 디바이스로 인식되기 때문에 이에 맞는 파일 시스템 드라이버가 필요하다. 이러한 문제 때문에 요즘에는 initramfs를 더 많이 사용한다.

    • LILO vs GRUB: LILO는 리눅스 초기부터 사용하던 부트로더로 작고 가볍지만, 커널을 변경할 때마다 직접 lilo 명령을 실행해줘야 한다. GRUB은 이러한 문제를 해결해 자동으로 부트 이미지를 발견할 수 있고, 여러 운영체제에 대해 지원하므로 멀티 부팅이 가능하다. (참고)

  4. head.S를 실행해 커널을 초기화하고, 커널 이미지를 압축 해제한 후 커널을 실행한다. 커널이 실행되면, initramfs가 존재하는지 확인한 후 initramfs를 루트 파일시스템(/)으로 read-only로 마운트 한다. 그 후 init 프로세스를 실행한다.

  5. init 프로세스는 PID가 1번인 프로세스로, 루트 파일시스템이 마운트 된 후 가장 먼저 실행되는 프로세스이다. 다양한 시스템 초기화 작업을 하고, 시간이나 네트워크 등의 기본 서비스들을 시작한다.

initramfs 유무에 따른 Boot Sequence


부트로더의 역할

  1. 하드웨어 초기화
  2. 커널 이미지 로드

참고할 만한 링크: https://0xax.gitbooks.io/linux-insides/Booting/

'Embedded System' 카테고리의 다른 글

Android Boot Sequence  (0) 2020.05.26
임베디드 시스템의 Boot Sequence  (0) 2020.05.26
Cross Compile  (0) 2020.05.25
Linux Kernel의 개념  (0) 2020.05.22
Embedded System의 개념  (0) 2020.05.22
Comments