부트로더

섬네일|널리 사용되는 자유 부트로더인 GNU GRUB
[섬네일|right|[윈도우 비스타 시작 프로세스]]
**부트로더**(bootloader) 또는 **부트 로더**(boot loader) 또는 **부트스트랩 로더**(bootstrap loader)는 컴퓨터를 부팅하고 운영 체제를 부팅하는 역할을 하는 컴퓨터 프로그램이다. 여러 부팅 선택지가 있는 대화형 메뉴도 제공하는 경우 **부트 매니저**라고도 불린다.

컴퓨터가 꺼지면 소프트웨어(운영 체제, 애플리케이션 코드, 데이터 포함)는 비휘발성 메모리에 저장된 상태로 유지된다. 컴퓨터 전원을 켜면 일반적으로 랜덤 액세스 메모리(RAM)에 운영 체제나 로더가 없다. 컴퓨터는 먼저 부트 롬에 저장된 비교적 작은 프로그램을 실행하는데, 이는 고정 기억 장치(ROM, 나중에는 EEPROM, NOR 플래시)와 함께 필요한 데이터를 사용하여 CPU, 마더보드, 메모리, 스토리지 및 기타 I/O 장치와 같은 하드웨어 장치를 초기화하고, 운영 체제 프로그램과 데이터를 RAM으로 로드할 수 있는 비휘발성 장치(일반적으로 블록 장치, 예: NAND 플래시) 또는 장치에 액세스한다.

일부 초기 컴퓨터 시스템은 사람 운영자 또는 주변 장치로부터 부팅 신호를 받으면 특정 위치의 메모리에 아주 적은 수의 고정된 명령을 로드하고, 최소한 하나의 CPU를 초기화한 다음, CPU를 해당 명령으로 지정하고 실행을 시작할 수 있다. 이러한 명령은 일반적으로 일부 주변 장치(운영자가 스위치로 선택할 수 있음)에서 입력 작업을 시작한다. 다른 시스템은 주변 장치 또는 I/O 컨트롤러에 하드웨어 명령을 직접 보내 극히 간단한 입력 작업(예: "시스템 장치의 0번 섹터를 메모리 1000번지부터 읽어라")이 수행되도록 하여, 소수의 부트 로더 명령을 메모리로 효과적으로 로드한다. 그런 다음 I/O 장치로부터의 완료 신호는 CPU에 의한 명령 실행을 시작하는 데 사용될 수 있다.

작은 컴퓨터는 컴퓨터가 빠르게, 그리고 미리 정해진 소프트웨어 구성으로 시작되도록 덜 유연하지만 더 자동적인 부트 로더 메커니즘을 사용하는 경우가 많다. 예를 들어, 많은 데스크톱 컴퓨터에서는 부트스트랩 프로세스가 CPU가 미리 정의된 주소에서 ROM에 포함된 소프트웨어(예: IBM PC 또는 IBM PC 호환기종의 바이오스/기본 입출력 시스템)를 실행하는 것으로 시작된다(인텔 x86 시리즈를 포함한 일부 CPU는 재설정 후 외부 도움 없이 이 소프트웨어를 실행하도록 설계되었다). 이 소프트웨어는 부팅에 참여할 수 있는 장치를 검색하고 가장 유력한 장치의 특수 섹션(가장 일반적으로 부트 섹터)에서 작은 프로그램을 로드하는 기본적인 기능을 포함하며, 일반적으로 섹터 시작과 같은 고정된 진입점에서 시작한다.

## 1단계 부트 로더
1단계 부트 로더의 예로는 바이오스, 통일 확장 펌웨어 인터페이스, 코어부트, Libreboot, Das U-Boot가 있다. 이는 CPU, 마더보드, 메모리, 저장 장치 및 기타 I/O 장치와 같은 하드웨어 장치를 초기화한다.

## 2단계 부트 로더

GNU GRUB, rEFInd, BOOTMGR, Syslinux, NTLDR과 같은 2단계 부트 로더는 그 자체로 운영 체제는 아니지만, 운영 체제를 제대로 로드하고 실행을 그 운영 체제로 전환할 수 있다. 운영 체제는 그 후 자체적으로 초기화되고 추가 장치 드라이버를 로드할 수 있다.

2단계 구현에는 대화형 사용자 인터페이스가 포함될 수 있어 부팅 옵션 선택 및 매개변수 수정이 가능하다. 이는 initrd/initramfs 이미지 처리를 포함하여 커널 로딩을 처리하며, 커널에 부팅 매개변수를 전달할 수 있다. 많은 구현은 추가 기능을 위한 로드 가능한 모듈을 지원하는 모듈식 설계를 사용한다. 이러한 선택지에는 다른 운영 체제(듀얼 또는 멀티 부팅을 위한 다른 파티션 또는 드라이브에서), 동일한 운영 체제의 다른 버전(새 버전에서 예기치 않은 문제가 발생한 경우), 다른 운영 체제 로딩 옵션(예: 복구 또는 안전 모드로 부팅), 그리고 메모리 테스터(예: memtest86+), 기본 셸(GNU GRUB에서와 같이), 심지어 게임(예: List of PC booter games)과 같이 운영 체제 없이 작동할 수 있는 일부 독립형 프로그램이 포함될 수 있다. 일부 부트 로더는 다른 부트 로더를 로드할 수도 있다. 예를 들어 GRUB은 윈도우를 직접 로드하는 대신 BOOTMGR을 로드한다. 일반적으로 기본 선택지는 시간 지연과 함께 미리 선택되며, 이 시간 동안 사용자는 키를 눌러 선택을 변경할 수 있다. 이 지연 후에는 기본 선택지가 자동으로 실행되어 상호 작용 없이 정상적인 부팅이 이루어질 수 있다.
또한 압축, 암호화 검증, 다른 부트 로더의 체인 로딩도 처리할 수 있다.
부팅 프로세스는 컴퓨터가 사용자와 상호 작용할 준비가 되었거나 운영 체제가 시스템 프로그램 또는 응용 프로그램 실행할 수 있을 때 완료된 것으로 간주할 수 있다.
## 예시
### IBM 호환 개인용 컴퓨터
#### 레거시 바이오스
X86 컴퓨터에서 바이오스가 시동 자체 시험을 실행한 후, 1단계 부트 로더는 마스터 부트 레코드(MBR)에 위치한 콤팩트한 512바이트 프로그램이며 실행된다. 주소 0x7C00에서 16비트 리얼 모드로 실행되며, 2단계 부트 로더를 찾는다. 주요 과제는 엄격한 크기 제약 조건 내에서 이러한 작업을 수행하고 잠재적인 하드웨어 오류를 처리하는 것이다. 부트 로더는 디스크 구조를 탐색하고, 종종 파일 할당 테이블 지원을 구현하며, 바이오스 시작 상태에서 다음 부팅 단계를 위한 안정적인 환경으로의 섬세한 전환을 관리해야 한다.

1단계 MBR 부트 로더는 특히 크기 면에서 특이한 제약 조건에 직면할 수 있다. 예를 들어, 초기 IBM PC 및 호환 기종에서는 부트 섹터가 일반적으로 510바이트(또는 그 이하)의 코드와 32&nbsp;KiB(이후 64 KiB로 완화됨)의 시스템 메모리에서만 작동해야 하며, 원래 인텔 8088/인텔 8086 프로세서가 지원하는 명령만 사용해야 한다. 하드 디스크 드라이브 및 이동식 드라이브에 위치한 PC 부트 로더의 첫 번째 단계(FSBL, first-stage boot loader)는 기본 64바이트(4*16) 파티션 테이블과 4개의 파티션 항목, 그리고 BIOS가 적절한 부트 로더를 위해 요구하는 2바이트 부트 서명을 위한 공간을 남기기 위해 마스터 부트 레코드의 첫 446바이트(512-4*16-2) 내에 맞아야 한다. 또는 4개 이상의 파티션 항목(각각 16바이트로 최대 16개), 디스크 서명(6바이트), 디스크 타임스탬프(6바이트), 고급 활성 파티션(18바이트) 또는 특수 멀티 부팅 로더와 같은 추가 기능이 일부 환경에서 지원되어야 하는 경우에는 더 적은 공간에 맞아야 한다.

플로피 디스크와 슈퍼플로피 볼륨 부트 레코드에서는 DOS 4.0 이후 FAT12 및 FAT16 볼륨에서 확장 BIOS 매개변수 블록(EBPB)이 최대 59바이트(51+8, 3바이트 점프는 코드에 포함될 수 있음)를 차지하며, DOS 7.1과 함께 도입된 FAT32 EBPB는 87바이트를 필요로 하여, 섹터 크기가 512바이트라고 가정할 때 부트 로더를 위해 423바이트(512-87-2, 3바이트 점프는 코드에 포함될 수 있음)만 남는다. 따라서 마이크로소프트 부트 섹터는 전통적으로 부팅 프로세스에 특정 제약을 가했다. 예를 들어, 부팅 파일은 파일 시스템의 루트 디렉토리에 고정된 위치에 연속적인 섹터 내에 저장되어야 했고, 이는 `[[SYS (명령어)|SYS]]` 명령에 의해 처리되었고 나중에 DOS 버전에서 약간 완화되었다. 그런 다음 부트 로더는 파일의 처음 세 섹터를 메모리에 로드할 수 있었는데, 여기에는 파일의 나머지를 메모리에 로드할 수 있는 또 다른 내장 부트 로더가 포함되어 있었다. 마이크로소프트가 논리 블록 주소 지정(LBA) 및 FAT32 지원을 추가했을 때, 그들은 크기상의 이유로 386 명령어를 사용하여 두 개의 물리적 섹터에 걸쳐 있는 부트 로더로 전환했다. 동시에 다른 벤더들은 최소한의 사용 가능한 메모리(32&nbsp;KiB) 및 프로세서 지원(8088/8086)에 대한 원래 제약을 완화하지 않고도 훨씬 더 많은 기능을 단일 부트 섹터에 담을 수 있었다. 예를 들어, DR-DOS 부트 섹터는 FAT12, FAT16(DR DOS 3.31 이후) 및 FAT32(DR-DOS 7.07) 파일 시스템에서 부팅 파일을 찾아 파일이 고정된 위치에 연속적인 섹터에 저장되지 않은 경우에도 CHS 또는 LBA를 통해 파일 전체를 메모리에 로드할 수 있다.

X86 컴퓨터에서 2단계 부트 로더(예: PBR)는 1단계 부트 로더의 엄격한 512바이트 제한 없이 작동한다. 이는 일반적으로 8KB에서 수 메가바이트 크기의 더 정교한 환경에서 실행된다. 이 확장된 공간은 파일 시스템 지원, 런타임 구성 및 부트 로더 메뉴 인터페이스와 같은 복잡한 기능의 구현을 허용한다. 2단계 부트 로더는 자체 작동을 위한 드라이버가 필요 없지만, 일반적으로 제한된 하드웨어 기능과 낮은 성능으로 BIOS와 같은 시스템 펌웨어에서 제공하는 일반적인 저장소 액세스 방법을 사용할 수 있다.

X86 컴퓨터에서 3단계 부트 로더에는 IO.SYS, NTLDR, BOOTMGR 및 GRUB이 포함된다.

#### UEFI
통일 확장 펌웨어 인터페이스(CSM 부팅 제외)는 부트 섹터에 의존하지 않으며, EFI 시스템 파티션에서 다음 단계 부트 로더(예: BOOTMGR 및 GRUB2)를 직접 로드한다.

### IBM 시스템/360 및 후속 기종
IBM 시스템/360 및 후속 기종에서 **LOAD** 운영자 제어는 Initial Program Load(IPL)라는 프로세스를 시작하며, 이는
#시스템 재설정을 수행한다.
#선택된 장치에 Read IPL (IPL) 채널 명령(02|16)을 보내 24바이트를 0-23 위치에 읽어들이고, 채널이 8번 위치에서 CCW(채널 명령 워드)를 가져오기 시작하도록 한다. 이는 채널이 0번 위치에서 24의 길이, 0의 주소, Command Chaining + Suppress Length Indication 플래그를 포함하는 CCW를 가져온 것과 같은 효과를 낸다.
#작업 완료 시 시스템은 I/O 주소를 2번 위치의 하프워드에 저장하고, 0번 위치에서 PSW(프로그램 상태 워드)를 로드한다.

S/360부터 Z/아키텍처까지의 운영 체제는 직접 접근 저장 장치(DASD), 즉 디스크, 드럼에 상주한다. 이들 장치에 대해 Read IPL은 실린더 0000|16, 헤드 0000|16으로 탐색하고, 레코드 01|16으로 정렬한다. 모든 지원되는 운영 체제에 대해 레코드 01|16은 부트스트랩 레코드를 읽는 Read Data CCW와 부트스트랩으로의 Transfer In Channel(TIC) CCW를 포함한다. 부트스트랩의 채널 프로그램은 첫 번째 IPL 프로그램 텍스트 명령을 가리키는 PSW로 시작하여 IPL 프로그램 텍스트를 0번 위치로 읽어들인다.

OS/360의 경우 IPL 프로그램은 일부 초기화를 수행하고, 자신을 재배치하고, Nucleus를 찾아 Nucleus를 로드한 다음 Nucleus 끝에 있는 Nucleus Initialization Program(NIP)으로 제어를 전달한다.

## 임베디드 및 다단계 부트 로더

많은 임베디드 시스템은 즉시 부팅되어야 한다. 예를 들어, 디지털 텔레비전이나 GPS 내비게이션 장치가 시작되기를 1분 동안 기다리는 것은 일반적으로 용납될 수 없다. 따라서 이러한 장치에는 ROM 또는 플래시 메모리에 소프트웨어 시스템이 있어 장치가 즉시 작동을 시작할 수 있다. 로딩은 미리 계산되어 장치 제조 시 ROM에 저장될 수 있기 때문에 로딩이 거의 필요하지 않다.

크고 복잡한 시스템은 운영 체제 및 기타 프로그램이 로드되어 실행될 준비가 될 때까지 여러 단계를 거쳐 진행되는 부팅 절차를 가질 수 있다. 운영 체제는 시작되거나 중단되지 않는 것처럼 설계되었기 때문에 부트 로더는 운영 체제를 로드하고, 그 시스템 내의 단순한 프로세스로 자신을 구성한 다음, 제어권을 운영 체제로 돌이킬 수 없게 전환할 수 있다. 그런 다음 부트 로더는 다른 프로세스와 마찬가지로 정상적으로 종료된다.

## 네트워크 부팅

대부분의 컴퓨터는 컴퓨터 망을 통해 부팅할 수도 있다. 이 시나리오에서는 운영 체제가 서버의 디스크에 저장되며, 일부 부분이 TFTP와 같은 간단한 프로토콜을 사용하여 클라이언트로 전송된다. 이러한 부분이 전송된 후 운영 체제가 부팅 프로세스의 제어권을 넘겨받는다.

2단계 부트 로더와 마찬가지로 네트워크 부팅은 네트워크 인터페이스의 부트 롬에서 제공하는 일반적인 네트워크 액세스 방법을 사용하여 시작되며, 여기에는 일반적으로 사전 부팅 실행 환경(PXE) 이미지가 포함되어 있다. 드라이버는 필요하지 않지만, 운영 체제 커널 및 드라이버가 전송되고 시작될 때까지 시스템 기능이 제한된다. 결과적으로 ROM 기반 부팅이 완료되면 네트워크 인터페이스를 사용할 수 없는 운영 체제로 네트워크 부팅하는 것이 전적으로 가능하다.

## 같이 보기
* 펌웨어
* Initial Program Load (IPL)
* Comparison of bootloaders
## 내용주

## 각주

## 외부 링크
* Bootloader - OSDev Wiki