원문 보기: https://dawoum.duckdns.org/wiki/Bootloader
부트로더(bootloader)는, 역시 부트 로더(boot loader)로 쓰며, 또는 부트스트랩 로더(bootstrap loader)라고도 하며, 컴퓨터 부팅을 담당하는 컴퓨터 프로그램입니다. 여러 부팅 선택을 갖는 대화형 메뉴도 제공하면, 종종 부트 관리자(boot manager)라고 불립니다.
컴퓨터가 꺼질 때, 그 소프트웨어 (운영 시스템, 응용 프로그램 코드, 데이터 포함)는 비휘발성 메모리에 저장됩니다. 컴퓨터가 켜질 때, 전형적으로 랜덤-액세스 메모리 (RAM)에 운영 시스템 또는 그것의 로더를 가지지 않습니다. 컴퓨터는 먼저 읽기-전용 메모리 (ROM, 그리고 나중에는 EEPROM, NOR 플래시)에 저장된 비교적 작은 프로그램과 일부 필요한 데이터를 실행하여, RAM을 초기화하고 (특히 x86 시스템), 비휘발성 장치 (보통 블록 장치, 예를 들어, NAND 플래시) 또는 운영 시스템 프로그램과 데이터가 RAM에 로드될 수 있는 장치에 접근합니다.
일부 초기 컴퓨터 시스템은, 인간 운영자 또는 주변 장치로부터 부팅 신호를 받으면, 매우 적은 수의 고정된 명령어를 특정 위치의 메모리에 적재하고, 적어도 하나의 CPU를 초기화하고, 그런-다음 CPU를 명령어로 가리키고 실행을 시작할 수 있습니다. 이들 명령어는 전형적으로 일부 주변 장치 (운영자가 스위치로 선택할 수 있음)에서 입력 작업을 시작합니다. 다른 시스템은 하드웨어 명령을 주변 장치 또는 I/O 컨트롤러에 직접 보내 매우 간단한 입력 작업 (예를 들어, "시스템 장치의 섹터 0을 위치 1000에서 시작하여 메모리에 읽음")을 수행하여, 효과적으로 적은 수의 부트 로더 명령어를 메모리에 적재할 수 있습니다; 그런 다음 I/O 장치로부터 완료 신호는 CPU에 의해 명령어의 실행을 시작하기 위해 사용될 수 있습니다.
작은 컴퓨터는 그것이 빠르게 시작되고 미리-정해진 소프트웨어 구성으로 시작됨을 보장하기 위해 종종 덜 유연하지만 더 자동화된 부트 로더 메커니즘을 사용합니다. 많은 데스크톱 컴퓨터에서, 예를 들어, 부트스트래핑 프로세스는 CPU가 미리-정의된 주소에서 ROM (예를 들어, IBM PC 또는 IBM PC 호환의 BIOS)에 포함된 소프트웨어를 실행하는 것으로 시작합니다 (Intel x86 시리즈를 포함한 일부 CPU는 외부 도움 없이 재설정 후 이 소프트웨어를 실행하도록 설계되었습니다). 이 소프트웨어에는 부팅에 참여할 수 있는 장치를 검색하고 가장 유망한 장치의 특수 섹션 (대부분 공통적으로 부트 섹터)에서 작은 프로그램을 적재하는 기본 기능이 포함되어 있으며, 전형적으로 섹터의 시작과 같은 고정된 진입점에서 시작합니다.
First-stage boot loader
1-단계 부트로더는 마스터 부트 레코드 (MBR)에 상주하고 컴퓨터가 시작할 때 실행하는 컴팩트 512-바이트 프로그램입니다. 주소 0x7C00에서 16-비트 리얼 모드로 실행하여, 최소한의 하드웨어 초기화를 수행하고, 기본 실행 환경을 설정하고, 2-단계 부트로더를 찾습니다. 그것의 주요 과제는 잠재적인 하드웨어 오류를 처리하는 동시에 엄격한 크기 제약 내에서 이들 임무를 수행하는 것입니다. 부트로더는 디스크 구조를 탐색해야 하며, 종종 FAT 파일 시스템 지원을 구현하고, BIOS 시작 상태에서 다음 부팅 단계에 대해 안정적인 환경으로의 섬세한 전환을 관리해야 합니다.
부트 로더는 특히 크기에 있어서 독특한 제약에 직면할 수 있습니다; 예를 들어, 초기 IBM PC와 호환 컴퓨터에서, 부트 섹터는 전형적으로 510바이트의 코드 (또는 그 이하)와 32KiB (나중에 64KiB로 완화됨)의 시스템 메모리에서만 작동해야 하고 원래 8088/8086 프로세서에서 지원하는 명령어만 사용해야 합니다. 고정식 디스크와 이동식 드라이브에 위치된 PC 부트 로더의 첫 번째 단계 (FSBL, 1-단계 부트 로더)는 기본 64-바이트 파티션 테이블 (4개의 파티션 엔트리를 가짐)과 2-바이트 부트 서명을 위한 공간을 남겨두기 위해 마스터 부트 레코드의 처음 446바이트에 맞아야 하며, 이는 BIOS가 적절한 부트 로더에 요구하는 사항입니다 — 또는 4개 이상의 파티션 엔트리 (각각 16바이트로 최대 16개), 디스크 서명 (6바이트), 디스크 타임스탬프 (6바이트), 고급 활성 파티션 (18바이트) 또는 특수 멀티-부트 로더와 같은 추가 기능도 일부 환경에서 지원해야 하는 경우에는 그보다 적어야 할 수도 있습니다.
플로피와 슈퍼플로피 볼륨 부트 레코드에서, DOS 4.0 이후 FAT12와 FAT16 볼륨의 확장 BIOS 매개변수 블록에 최대 59바이트가 사용되고, 반면에 DOS 7.1과 함께 도입된 FAT32 EBPB는 87바이트가 필요하여 섹터 크기가 512바이트라고 가정할 때 부트 로더에 423바이트만 남습니다. 따라서, Microsoft 부트 섹터는 전통적으로 부트 프로세스에 특정한 제한을 가했습니다. 예를 들어, 부트 파일은 파일 시스템의 루트 디렉토리에 고정된 위치에 있어야 하고 연속된 섹터에 저장되어야 했으며, 이 조건은 SYS 명령에서 처리되었고 이후 버전의 DOS에서 약간 완화되었습니다. 그런 다음 부트 로더는 파일의 처음 세 섹터를 메모리에 적재할 수 있었고, 여기에는 파일의 나머지 부분을 메모리에 적재할 수 있는 또 다른 내장 부트 로더가 포함되어 있었습니다. Microsoft에서 LBA와 FAT32 지원을 추가했을 때, 그들은 크기 문제로 386개의 명령어를 사용하여 두 개의 물리적 섹터에 도달하는 부트 로더로 전환했습니다. 같은 시기에, 다른 공급업체는 오직 최소한의 사용 가능한 메모리 (32KiB)와 프로세서 지원 (8088/8086)에 대한 원래 제약을 완화하지 않고도 단일 부트 섹터에 훨씬 더 많은 기능을 압축하는 데 성공했습니다. 예를 들어, DR-DOS 부트 섹터는 FAT12, FAT16, 및 FAT32 파일 시스템에서 부트 파일을 찾고, 파일이 고정된 위치와 연속된 섹터에 저장되지 않은 경우에도 CHS 또는 LBA를 통해 전체 메모리에 적재할 수 있습니다.
BIOS와 UEFI는 비휘발성 장치에서 여러 운영 시스템을 적재할 수 있을 뿐만 아니라, 그것들은 로드된 운영 시스템에 대한 시스템 하드웨어를 초기화할 수도 있습니다.
1-단계 부트로더의 예로는 BIOS, UEFI, coreboot, Libreboot, 및 Das U-Boot 등이 있습니다.
Second-stage boot loader
2-단계 부트로더는 1-단계 부트로더의 엄격한 512-바이트 제한 없이 작동합니다. 그것들은 전형적으로 8KB에서 수 메가바이트 크기까지 다양한 보다 정교한 환경에서 실행됩니다. 이 확장된 공간을 통해 여러 파일 시스템 지원, 런타임 구성, 및 부트로더 메뉴 인터페이스를 포함한 복잡한 기능을 구현할 수 있습니다. 2-단계 부트로더는 포괄적인 하드웨어 초기화를 수행합니다. 그것들은 메모리 컨트롤러, 인터럽트 컨트롤러, 및 필수 주변 장치를 포함한 다양한 시스템 구성 요소를 질의하고 구성합니다. 최신 구현은 종종 ACPI 테이블, USB 컨트롤러 초기화, 및 예비 그래픽 설정을 처리합니다. GNU GRUB, rEFInd, BOOTMGR, Syslinux, NTLDR, 또는 iBoot와 같은 2-단계 부트로더는 그 자체로 운영 시스템은 아니지만 운영 시스템을 적절히 적재하고 실행을 전송할 수 있습니다; 운영 시스템은 이후 자체를 초기화하고 여분의 장치 드라이버를 적재할 수 있습니다. 2-단계 부트로더는 자체 작동을 위해 드라이버가 필요하지 않지만, 대신 BIOS나 Open Firmware와 같은 시스템 펌웨어에 의해 제공되는 일반적인 저장 장치 접근 방법을 사용할 수 있지만, 전형적으로 하드웨어 기능이 제한적이고 성능이 낮습니다.
2-단계 구현에는 대화형 사용자 인터페이스가 포함될 수 있으며, 이를 통해 부팅 옵션 선택과 매개변수 수정이 가능합니다. 그것들은 initrd/initramfs 이미지 처리를 포함한 커널 로딩을 처리하고 부팅 매개변수를 커널에 전달할 수 있습니다. 많은 구현이 추가 기능을 위한 로드 가능한 모듈을 지원하는 모듈식 설계를 구현합니다. 이들 선택 사항에는 다양한 운영 시스템 (다양한 파티션이나 드라이브에서 듀얼 또는 멀티 부팅), 같은 운영 시스템의 다양한 버전 (새 버전에 예상치 못한 문제가 있는 경우), 다양한 운영 시스템 로딩 옵션 (예를 들어, 복구 또는 안전 모드로 부팅), 및 메모리 테스터 (예를 들어, memtest86+), 기본 셸 (GNU GRUB에서와 같이), 또는 게임 (PC 부팅 게임의 목록 참조)과 같이 운영 시스템 없이도 작동할 수 있는 일부 독립 실행형 프로그램이 포함될 수 있습니다. 일부 부트 로더는 다른 부트 로더도 로드할 수 있습니다; 예를 들어, GRUB는 Windows를 직접 로드하는 대신 BOOTMGR을 로드합니다. 보통, 기본 선택 사항은 사용자가 키를 눌러 선택 사항을 변경할 수 있는 시간 지연과 함께 미리 선택됩니다; 이 지연 후, 기본 선택이 자동으로 실행되어 상호 작용 없이 정상적인 부팅이 발생할 수 있습니다. 그것들은 역시 압축, 암호화 검증, 및 다른 부트로더의 체인-로딩을 처리할 수도 있습니다. 컴퓨터가 사용자와 상호 작용할 준비가 되었거나 운영 시스템이 시스템 프로그램이나 응용 프로그램을 실행할 수 있을 때 부팅 프로세스가 완료된 것으로 고려될 수 있습니다.
Embedded and multi-stage boot loaders
많은 임베디드 시스템은 즉시 부팅해야 합니다. 예를 들어, 디지털 텔레비전이나 GPS 내비게이션 장치가 시작될 때까지 1분 동안 기다리는 것은 일반적으로 용납할 수 없습니다. 그러므로, 그러한 장치는 ROM이나 플래시 메모리에 소프트웨어 시스템이 있어 장치가 즉시 작동을 시작할 수 있습니다; 로딩은 거의 또는 전혀 필요하지 않은데, 왜냐하면 로딩은 장치가 만들어질 때 미리 계산되어 ROM에 저장될 수 있기 때문입니다.
크고 복잡한 시스템은 운영 시스템과 다른 프로그램이 로드되어 실행할 준비가 될 때까지 여러 단계로 진행되는 부팅 절차를 가질 수 있습니다. 운영 시스템은 시작하거나 중지하지 않는 것처럼 설계되었기 때문에, 부트 로더는 운영 시스템을 로드하고, 해당 시스템 내의 단순한 프로세스로 자신을 구성하고, 그런-다음 취소 불가능하게 운영 시스템으로 제어를 이전할 수 있습니다. 그런-다음 부트 로더는 임의의 다른 프로세스와 마찬가지로 정상적으로 종료됩니다.
Network booting
대부분의 컴퓨터는 컴퓨터 네트워크를 통해 부팅할 수도 있습니다. 이 시나리오에서, 운영 시스템은 서버의 디스크에 저장되고, 특정 부분은 Trivial File Transfer Protocol (TFTP)과 같은 간단한 프로토콜을 사용하여 클라이언트로 전송됩니다. 이들 부분이 전송된 후, 운영 시스템이 부팅 프로세스의 제어를 인계합니다.
2-단계 부트 로더와 마찬가지로, 네트워크 부팅은 전형적으로 Preboot Execution Environment (PXE) 이미지를 포함하는 네트워크 인터페이스의 부트 ROM에서 제공하는 일반적인 네트워크 접근 방법을 사용함으로써 시작합니다. 드라이버는 필요하지 않지만, 운영 시스템 커널과 드라이버가 전송되어 시작될 때까지 시스템 기능이 제한됩니다. 결과로써, ROM-기반 부팅이 완료되면, 네트워크 인터페이스를 사용할 수 없는 운영 시스템으로 네트워크 부팅하는 것이 완전히 가능합니다.