0단계 : 시스템 전원 공급
파워버튼을 통해 전원이 공급되면, 메인보드는 리셋벡터를 통해 CPU가 BIOS 코드를 호출하도록 한다.
모든 Intel CPU들은 전원 공급 직후 초기 부팅 때 Realmode로 작동하는데, 이 시점에서는 전체 메모리의 1MB영역 까지만 접근 할 수 있다.(이 영역의 주소는 0xFFFFFFFF이다.)
초기부팅 직후 CPU가 처음 하게 될 일은 EIP(Extend Instruction Pointer: 메모리에 등록되어 있는 코드의 주소를 가리키는 포인터)에 숨겨진 0xFFFFFFF0 주소로 점프하는 것이다. 이 주소는 펌웨어의 엔트리 포인트로 매핑되는 영역으로 리셋벡터라고 한다.
즉 부팅 직후 CPU는 리셋벡터를 통해 펌웨어(BIOS, EFI)로 접근하고, 이곳에서 펌웨어 코드(BIOS code)를 실행한다.
펌웨어(BIOS, EFI)는 시스템의 하드웨어 구성을 저장한다.)
특히 BIOS는 레거시 바이오스라고 불리며, 하드디스크의 첫 섹터를 읽어서 첫 섹터에 지시된 주소에 있는 코드를 실행하도록 하는 부팅 절차를 따른다.
<Summary>
- 전원공급이 되면, CPU는 *리셋벡터를 통해 BIOS로 접근하여 BIOS 코드를 실행한다.
*리셋벡터: 펌웨어의 엔트리 포인트로 매핑되는 주소를 가리키는 포인터
- 메인보드의 ROM-BIOS에 있는 BIOS 프로그램을 자동실행한다. (ROM에 저장되어 있어 흔히 ROM-BIOS라고 부름)
- BIOS 프로그램은 전원공급과 함께 메모리 특정번지에 자동 로드 된다.
- CPU는 전원공급과 함께 특정번지의 BIOS 프로그램을 자동 실행한다.
1단계 : BIOS 단계
자체진단기능(POST: Power On Self Test)를 수행한다.
=> CPU, RAM, 제어장치, BIOS 코드 자체, 주변장치 등에 대한 검사를 진행하고, 하드웨어들을 초기화하는 작업을 한다.
POST과정이 이상 없이 완료되면 검색된 부팅매체(하드디스크,CD-ROM, 플로피디스크 등)에서 부트로더를 불러들인다.
예를 들어, 하드디스크가 부팅매체로 선택되었다면 하드디스크의 부팅파티션에 있는 0번섹터(MBR)에 있는 부트로더(GRUB)을 읽어 들인다.
부트로더(GRUB)이 메모리에 적재되면 BIOS는 종료되고, 시스템 제어권은 부트로더(GRUB)이 갖게 된다.
<Summary>
- POST(자체진단기능) 수행을 통해 장치 검사 및 하드웨어 초기화
- 부팅 디바이스(하드디스크 등)를 검색한다.
- 여기서 디스크 내에 있는 MBR에 있는 코드(부트로더 코드)를 메모리로 로딩하고 수행을 시킨다.
- 그럼,이 MBR이 부트로더를 로딩을 하게 된다.
- 부트로더가 메모리에 적재되면 BIOS는 종료되고, 시스템 제어권은 부트로더가 갖게된다.
2단계 : 부트로더 단계
리눅스에서 사용하는 부트로더는 LILO(Linux Loade)나 GRUB(Grand Unified Bootloader)이 있다.
GRUB은 커널 이미지를 불러들이고 시스템 제어권을 커널에게 넘겨준다.
GRUB은 GRUB stage1-> 1.5-> 2 세단계를 거치는 부트로더로 GRUB2가 가장 보편적으로 많이 사용된다.
GRUB stage 1
MBR 또는 VBR에 저장되어 있는 부트 이미지가 메모리에 로드되고 실행된다.
GRUB stage 1.5
MBR과 첫번째 파티션에 있는 블록에 저장된 core.img가 메모리에 로드되고 실행된다. core.img의 configuration 파일과 파일 시스템을 위한 드라이버를 로드한다.
GRUB stage 2
/boot/grub 파일 시스템에 직접 접근하여 커널(vmlinuz)의 압축을 풀어 메모리에 로드하고, 커널이 필요로 하는 모든 드라이버와 모듈, 파일시스템 등이 담긴 RAM 디스크 파일을 메모리에 로드한다.
커널은 로드되기 이전 /boot 아래 압축된 형태인 vmlinux 로 존재 > GRUB stage2에서 압축 풀고 로드
커널 컴파일을 통해 GRUB을 통해 로드할 커널 버전을 고를 수 있다.
3단계 : 커널로드 단계
- 부팅 2단계까지 지나며 현재 부트로더는 커널파일과 RAM디스크 파일을 메모리에 로드해놓은 상태이다.
- vmlinux-2.6.26-2-686 - initrd.img-2.6.26-2-686
/etc/grub/grub.conf 파일에 의해서 커널이 메모리상에서 실행되면, 하드웨어를 점검하고 /var/log/dmesg 파일에 기록을 한다.
루트 파일시스템(/)을 읽기 전용으로 마운트 한다. 만약 마운트 실패시 “커널 패닉” 메세지를 출력한다.
커널은 swapper프로세스(PID 0번)를 호출한다.
swapper(PID 0번)는 커널이 사용할 각 장치드라이브들을 초기화하고 init프로세스(PID 1번)가 실행하게 된다.