부팅

섬네일|컴퓨터 부팅 순서의 흐름도

**부팅**() 또는 **부팅업**()은 컴퓨터의 물리적 버튼과 같은 컴퓨터 하드웨어 또는 소프트웨어 명령을 통해 시작되는 컴퓨터 시작 프로세스이다. 전원을 켜면 컴퓨터의 CPU는 주기억장치에 소프트웨어가 없으므로 실행되기 전에 어떤 프로세스가 소프트웨어를 메모리에 로드해야 한다. 이것은 CPU의 하드웨어 또는 펌웨어에 의해, 또는 컴퓨터 시스템의 별도 프로세서에 의해 수행될 수 있다. 일부 시스템에서는 전원 켜기 재설정(POR)이 부팅을 시작하지 않으며, POR이 완료된 후 작업자가 부팅을 시작해야 한다. IBM은 일부 제품 라인에서 **초기 프로그램 로드** (**IPL**)라는 용어를 사용한다.

컴퓨터를 다시 시작하는 것을 재부팅이라고도 하는데, 이는 "하드" 재부팅(예: CPU 전원이 꺼짐에서 켜짐으로 전환된 후) 또는 "소프트" 재부팅(전원이 차단되지 않음)일 수 있다. 일부 시스템에서는 소프트 부팅 시 선택적으로 램을 0으로 지울 수 있다. 하드 부팅과 소프트 부팅 모두 버튼 누름과 같은 하드웨어 또는 소프트웨어 명령으로 시작할 수 있다. 부팅은 작동하는 런타임 시스템, 일반적으로 운영체제 및 일부 애플리케이션이 달성되면 완료된다.

절전 (일시 정지) 상태에서 컴퓨터를 복원하는 프로세스는 부팅을 포함하지 않는다. 그러나 하이버네이션 상태에서 복원하는 것은 부팅을 포함한다. 최소한 일부 임베디드 시스템은 기능을 시작하기 위해 눈에 띄는 부팅 시퀀스가 필요하지 않으며, 전원을 켜면 단순히 ROM에 저장된 작동 프로그램을 실행할 수 있다. 모든 컴퓨팅 시스템은 상태 기계이며, 재부팅은 의도하지 않은 잠긴 상태에서 지정된 0 상태로 돌아가는 유일한 방법일 수 있다.

운영체제 또는 독립형 유틸리티를 로드하는 것 외에도 부팅 프로세스는 운영체제의 문제를 진단하기 위한 스토리지 덤프 프로그램을 로드할 수도 있다.

부팅은 부트스트랩의 약어 또는 부트스트랩 로드이며, 자력으로 해내다라는 문구에서 유래한다. 이 용법은 대부분의 소프트웨어가 컴퓨터에서 이미 실행 중인 다른 소프트웨어에 의해 컴퓨터에 로드되는 경우, 초기 소프트웨어를 컴퓨터에 로드하는 메커니즘이 존재해야 한다는 요구 사항에 주목한다. 초기 컴퓨터는 이 문제를 해결하기 위해 작은 프로그램을 메모리에 로드하는 다양한 임시 방법을 사용했다. 다양한 유형의 ROM 발명으로 컴퓨터가 지워지지 않는 부트 롬에 저장된 시작 프로그램을 탑재하여 이 역설을 해결할 수 있게 되었다. ROM 용량의 증가는 훨씬 더 정교한 시작 절차를 구현할 수 있게 했다.

## 역사
[섬네일|[에니악 (1946)을 프로그래밍하는 데 사용된 스위치와 케이블]]
컴퓨터에 짧은 초기 프로그램을 로드하는 여러 가지 방법이 있다. 이러한 방법은 간단한 물리적 입력에서 더 복잡한 프로그램을 담을 수 있는 이동식 미디어에 이른다.

### 집적 회로 ROM 이전 예시
#### 초기 컴퓨터
1940년대와 1950년대의 초기 컴퓨터는 프로그래밍에 몇 주가 걸릴 수 있는 일회성 공학 노력으로, 프로그램 로딩은 해결해야 할 여러 문제 중 하나였다. 초기 컴퓨터인 에니악은 메모리에 저장된 프로그램이 없었지만, 상호 연결 케이블 구성에 따라 각 문제에 맞게 설정되었다. 부트스트랩은 에니악에 적용되지 않았다. 에니악의 하드웨어 구성은 전원이 공급되는 즉시 문제를 해결할 준비가 되어 있었다.

두 번째 저장 프로그램 컴퓨터인 에드삭 시스템은 시작 버튼을 누르면 고정된 프로그램을 메모리로 전송하기 위해 계단식 스위치를 사용했다. 데이비드 휠러가 1948년 말에 완성한 이 장치에 저장된 프로그램은 천공 테이프에서 추가 명령을 로드한 후 실행했다.

#### 최초의 상업용 컴퓨터
상업 판매를 위한 최초의 프로그래밍 가능한 컴퓨터, 예를 들어 유니박 I과 IBM 701은 작동을 단순화하는 기능을 포함했다. 이들은 일반적으로 완전한 입출력 작업을 수행하는 명령어를 포함했다. 동일한 하드웨어 로직을 사용하여 단일 버튼을 누름으로써 천공 카드 (가장 일반적인 것) 또는 마그네틱 드럼 또는 자기 테이프와 같은 다른 입력 미디어의 내용을 로드할 수 있었는데, 이 미디어에는 부트스트랩 프로그램이 포함되어 있었다. 이 부팅 개념은 1950년대와 1960년대 초반의 IBM 컴퓨터에 대해 다양한 이름으로 불렸지만, IBM은 IBM 7030 스트레치에서 "초기 프로그램 로드"라는 용어를 사용했고, 이후 1964년 IBM 시스템/360을 시작으로 메인프레임 라인에 사용했다.

[섬네일|[IBM 1130 (1965)의 초기 프로그램 로드 천공 카드]]

IBM 701 컴퓨터(1952~1956)에는 '로드' 버튼이 있었는데, 이 버튼을 누르면 로드 선택 스위치의 위치에 따라 천공 카드 판독기의 천공 카드, 테이프 드라이브의 자기 테이프 또는 자기 드럼 장치에서 첫 번째 36비트 워드를 주기억장치로 읽어들이는 작업이 시작되었다. 그런 다음 왼쪽 18비트 하프 워드는 명령어처럼 실행되었고, 이는 일반적으로 추가 워드를 메모리로 읽어 들였다. 로드된 부트 프로그램이 실행되었고, 이는 다시 인간 조작자의 추가 도움 없이 해당 매체에서 더 큰 프로그램을 메모리로 로드했다. IBM 704, IBM 7090, 및 IBM 7094는 유사한 메커니즘을 가졌지만, 다른 장치에 대해 다른 로드 버튼을 가졌다. "부팅"이라는 용어는 적어도 1958년부터 이러한 의미로 사용되었다.

섬네일|1970년대 IBM 시스템/3 콘솔. 프로그램 로드 선택 스위치는 왼쪽 아래, 프로그램 로드 스위치는 오른쪽 아래.
그 시대의 다른 IBM 컴퓨터들도 유사한 기능을 가지고 있었다. 예를 들어, IBM 1401 시스템(1958년경)은 카드 판독기를 사용하여 천공 카드에서 프로그램을 로드했다. 천공 카드에 저장된 80개의 문자는 메모리 위치 001에서 080으로 읽혀졌고, 컴퓨터는 메모리 위치 001로 분기하여 첫 번째 저장된 명령어를 읽었다. 이 명령어는 항상 동일했다: 이 첫 80개의 메모리 위치에 있는 정보를 어셈블리 영역으로 이동하여 천공 카드 2, 3, 4 등의 정보가 결합되어 저장된 프로그램을 형성할 수 있도록 하는 것이었다. 이 정보가 어셈블리 영역으로 이동되면, 기계는 080 위치의 명령어(카드를 읽음)로 분기하고 다음 카드를 읽어 정보가 처리되었다.

다른 예는 1953년의 십진법 기계인 IBM 650으로, 운영자 패널에 10개의 10위치 스위치 그룹이 있었는데, 이는 메모리 워드(주소 8000)로 주소 지정할 수 있었고 명령어로 실행될 수 있었다. 따라서 스위치를 7004000400으로 설정하고 해당 버튼을 누르면 카드 판독기의 첫 번째 카드를 메모리(옵코드 70)로 주소 400부터 읽어들이고, 400으로 점프하여 해당 카드에 있는 프로그램 실행을 시작했다. IBM 7040 및 7044는 유사한 메커니즘을 가지고 있었는데, 로드 버튼을 누르면 전면 패널의 입력 키에 설정된 명령어가 실행되고, 해당 명령어가 설정하는 채널에 주소 00100부터 메모리로 데이터를 전송하는 명령이 주어졌다. 전송이 완료되면 CPU는 주소 00101로 점프했다.

IBM의 경쟁사들도 단일 버튼 프로그램 로드를 제공했다.
* CDC 6600 (1964년경)은 144개의 토글 스위치가 있는 데드 스타트 패널을 가지고 있었다. 데드 스타트 스위치는 토글 스위치에서 12개의 12비트 워드를 주변 프로세서 (PP) 0의 메모리로 입력하고, PP 0이 메모리에 로드된 코드를 실행하게 함으로써 로드 시퀀스를 시작했다. PP 0은 필요한 코드를 자체 메모리에 로드한 다음 다른 PP들을 초기화했다.
* GE 645 (1965년경)는 "시스템 부트로드" 버튼을 가지고 있었는데, 이를 누르면 I/O 컨트롤러 중 하나가 다이오드 ROM에서 64워드 프로그램을 메모리로 로드하고, 해당 프로그램이 실행되도록 인터럽트를 발생시켰다.
* PDP-10의 첫 번째 모델은 "READ IN" 버튼을 가지고 있었는데, 이를 누르면 프로세서가 재설정되고 제어판의 스위치로 지정된 장치에서 I/O 작업이 시작되어, 후속 워드 읽기를 위한 대상 주소와 카운트를 제공하는 36비트 워드를 읽어 들였다. 읽기가 완료되면 프로세서는 마지막으로 읽어들인 워드로 점프하여 읽어들인 코드를 실행하기 시작했다.

이와 관련된 주목할 만한 변형은 버로스 B1700에서 발견되는데, 여기에는 부트 롬도 하드와이어드 IPL 작업도 없다. 대신, 시스템이 재설정된 후 전면 패널에 장착된 카세트 테이프 드라이브에서 마이크로명령어를 순차적으로 읽고 실행한다. 이로써 RAM에 부트 로더가 설정되고, 이 부트 로더가 실행된다. 그러나 이는 시스템에 대해 거의 가정을 하지 않으므로, 심각한 CPU 오류의 경우에도 전면 패널에 이해할 수 있는 코드를 표시하는 진단(유지보수 테스트 루틴) 테이프를 로드하는 데도 사용할 수 있다.

#### IBM 시스템/360 및 후속 제품

IBM 시스템/360 및 현재의 Z/아키텍처 기계를 포함한 후속 제품에서 부팅 프로세스는 초기 프로그램 로드 (IPL)로 알려져 있다.

IBM은 7030 (스트레치)를 위해 이 용어를 만들었고, 시스템/360 설계에 다시 도입했으며, 오늘날에도 해당 환경에서 계속 사용하고 있다. 시스템/360 프로세서에서 IPL은 컴퓨터 운영자가 세 자리 16진수 장치 주소 (CUU; C=I/O 채널 주소, UU=제어 장치 및 장치 주소)를 선택한 후 LOAD 버튼을 눌러 시작한다. 고성능 System/360 모델, 대부분의 System/370 및 일부 후기 시스템에서는 스위치와 LOAD 버튼의 기능이 그래픽 콘솔 화면의 선택 가능한 영역을 사용하여 시뮬레이션되며, 종종 IBM 2250과 유사한 장치 또는 IBM 3270과 유사한 장치이다. 예를 들어, System/370 모델 158에서 키보드 시퀀스 0-7-X (영, 칠, X 순서)는 입력 영역에 입력된 장치 주소에서 IPL을 발생시킨다. 암달 470V/6 및 관련 CPU는 선택적인 두 번째 채널 장치가 설치된 CPU에서 네 자리 16진수를 지원하여 총 32개 채널을 지원했다. 이후 IBM도 16개 이상의 채널을 지원하게 된다.

IBM Z 이전의 IBM 시스템/360 및 그 후속 제품(예: 암달 제품군)에서 IPL 기능은 운영자가 지정한 장치에서 24바이트를 읽어 실제 주소 0부터 주 기억 장치에 로드한다. 두 번째와 세 번째 8바이트 그룹은 시동 프로그램을 계속 로드하기 위한 채널 명령 워드 (CCW)로 처리된다 (첫 번째 CCW는 항상 CPU에 의해 시뮬레이션되며, 명령 연쇄 및 잘못된 길이 표시 억제가 강제되는 읽기 IPL 명령 로 구성된다). I/O 채널 명령이 완료되면 첫 번째 8바이트 그룹이 프로세서의 프로그램 상태 워드 (PSW)에 로드되고, 해당 PSW로 지정된 위치에서 시동 프로그램이 실행을 시작한다. IPL 장치는 일반적으로 디스크 드라이브이므로,  읽기 명령에 특별한 의미가 부여되지만, 정확히 동일한 절차가 테이프 드라이브나 심지어 카드 판독기와 같은 다른 입력 장치에서 IPL을 수행하는 데도 장치 독립적인 방식으로 사용되어, 예를 들어 새 컴퓨터에 운영체제 초기 배포 자기 테이프에서 운영체제를 설치할 수 있다. 디스크 컨트롤러의 경우,  명령은 또한 선택된 장치가 실린더 , 헤드 로 탐색하여 탐색 실린더 및 헤드 명령 을 시뮬레이션하고, 레코드 를 검색하여 검색 ID 일치 명령 을 시뮬레이션하게 한다. 테이프 및 카드 컨트롤러는 탐색 및 검색을 시뮬레이션하지 않는다. 이러한 장치 클래스의 경우 읽기 IPL 명령은 단순히 순차 읽기 명령이다.

디스크, 테이프 또는 카드 덱은 실제 운영 체제 또는 독립 실행형 유틸리티를 주 기억 장치에 로드하기 위한 특수 프로그램을 포함해야 하며, 이 특정 목적을 위해 "IPL 텍스트"는 독립 실행형 DASDI (직접 액세스 저장 장치 초기화) 프로그램 또는 운영 체제에서 실행되는 동등한 프로그램(예: ICKDSF)에 의해 디스크에 배치되지만, IPL 가능한 테이프 및 카드 덱은 일반적으로 이 "IPL 텍스트"가 이미 존재하도록 배포된다.

IBM은 IPL 프로세스에 몇 가지 진화적 변화를 도입하여 시스템/370 확장 아키텍처(S/370-XA) 및 이후 버전에 대해 일부 세부 사항을 변경하고, z/아키텍처에 대한 새로운 유형의 IPL을 추가했다.

#### 미니컴퓨터
[섬네일|[PDP-8/E 전면 패널에 부트스트랩 프로그램을 로드하는 데 사용된 스위치들이 보인다.]]

디지털 이큅먼트 코퍼레이션 (DEC) PDP-5 및 PDP-8 (1965)부터 시작된 미니컴퓨터는 CPU를 이용하여 입출력 작업을 지원함으로써 설계를 단순화했다. 이는 비용을 절감했지만, 단일 버튼을 누르는 것보다 부팅을 더 복잡하게 만들었다. 미니컴퓨터는 일반적으로 전면 패널의 스위치 배열을 조작하여 짧은 프로그램을 토글로 입력하는 방법을 가지고 있었다. 초기 미니컴퓨터는 전원이 꺼져도 정보가 손실되지 않는 자기코어 메모리를 사용했기 때문에, 이러한 부트스트랩 로더는 지워지지 않는 한 그대로 유지되었다. 프로그램 버그로 인해 모든 메모리를 덮어쓰는 루프가 발생하면 우발적으로 지워지는 경우도 있었다.

이러한 간단한 형태의 부팅을 사용하는 다른 미니컴퓨터로는 휴렛팩커드의 HP 2100 시리즈(1960년대 중반), 오리지널 데이터 제너럴 노바 (1969), 그리고 DEC의 PDP-4 (1962) 및 PDP-11 (1970)이 있다.

미니컴퓨터 I/O 장치에서 읽기 작업을 유발하는 데 필요한 I/O 작업은 일반적으로 다른 장치 컨트롤러마다 달랐기 때문에, 다른 장치에는 다른 부트스트랩 프로그램이 필요했다.

DEC는 나중에 1971년에 PDP-11용으로 최대 32단어(64바이트)의 부트스트랩 프로그램을 저장하는 선택적 다이오드 매트릭스 ROM을 추가했다. 이것은 Unibus에 꽂히고 32x16 배열의 반도체 다이오드를 담고 있는 인쇄 회로 카드인 M792로 구성되었다. 모든 512개의 다이오드가 제자리에 있으면 메모리는 모든 "1" 비트를 포함했다. 이 카드는 비트가 "0"이 되도록 각 다이오드를 잘라냄으로써 프로그래밍되었다. DEC는 또한 필요 없는 다이오드를 단순히 생략하여 많은 표준 입력 장치용으로 미리 프로그래밍된 카드 버전인 BM792-Yx 시리즈를 판매했다.

이전 방식을 따르자면, 초기 PDP-1은 하드웨어 로더를 가지고 있어서, 운영자가 "로드" 스위치를 누르기만 하면 천공 테이프 판독기가 프로그램을 직접 코어 메모리에 로드하도록 지시할 수 있었다. PDP-7, PDP-9, 및 PDP-15 (PDP-4의 후속 모델)에는 천공 테이프에서 프로그램을 읽어 실행하는 Read-In 버튼이 추가되었다. 데이터 제너럴 슈퍼노바는 전면 패널 스위치를 사용하여 컴퓨터가 전면 패널의 데이터 스위치로 지정된 장치에서 메모리로 명령을 자동으로 로드하고, 로드된 코드로 점프하도록 했다.

##### 초기 미니컴퓨터 부트 로더 예시
천공 테이프 판독기가 있는 미니컴퓨터에서 부팅 프로세스에서 실행되는 첫 번째 프로그램인 부트 로더는 체크섬이 있는 천공 테이프를 읽을 수 있는 2단계 부트 로더(종종 이진 로더로 불림) 또는 외부 저장 매체에서 운영체제를 코어 메모리로 읽어 들였다. 부트 로더의 의사코드는 다음 8개 명령과 같이 간단할 수 있다.

# P 레지스터를 9로 설정
# 천공 테이프 판독기 준비 확인
# 준비되지 않았다면 2로 점프
# 천공 테이프 판독기에서 누산기로 1바이트 읽기
# P 레지스터의 주소에 누산기 저장
# 테이프 끝이라면 9로 점프
# P 레지스터 증가
# 2로 점프

관련된 예시는 1970년대 Nicolet Instrument Corporation 미니컴퓨터의 로더를 기반으로 하며, Teletype Model 33 ASR의 천공 테이프 판독기-천공 장치를 사용한다. 2단계 로더의 바이트는 천공 테이프에서 역순으로 읽혀진다.

# P 레지스터를 106으로 설정
# 천공 테이프 판독기 준비 확인
# 준비되지 않았다면 2로 점프
# 천공 테이프 판독기에서 누산기로 1바이트 읽기
# P 레지스터의 주소에 누산기 저장
# P 레지스터 감소
# 2로 점프

2단계 로더의 길이는 마지막 바이트가 7번 위치를 덮어쓰도록 되어 있다. 6번 위치의 명령이 실행된 후 7번 위치에서 2단계 로더가 실행되기 시작한다. 2단계 로더는 그 다음 운영체제가 포함된 훨씬 더 긴 테이프가 테이프 판독기에 놓일 때까지 기다린다. 부트 로더와 2단계 로더의 차이점은 천공 테이프 읽기 오류를 포착하기 위한 확인 코드의 추가인데, 이는 Teletype Model 33 ASR과 같은 비교적 저렴하고 "파트타임" 하드웨어에서 빈번하게 발생하는 일이다. (Friden Flexowriter는 훨씬 더 신뢰할 수 있었지만, 비용도 비교적 많이 들었다.)

#### 최초의 마이크로컴퓨터 부팅
앨테어 8800 (1975년 출시)과 그보다 더 이전의 유사한 기기(인텔 8008 CPU 기반)와 같은 초기 마이크로컴퓨터는 부트스트래핑 하드웨어 자체가 없었다. 전원이 켜지면 CPU는 임의의 데이터를 포함하는 메모리를 보게 되었다. 이 기기의 전면 패널에는 주소와 데이터를 입력하기 위한 토글 스위치가 있었고, 컴퓨터 메모리 워드와 주소 버스의 각 비트당 하나의 스위치가 있었다. 하드웨어에 간단한 추가를 통해 한 번에 하나의 메모리 위치를 해당 스위치에서 로드하여 부트스트랩 코드를 저장할 수 있었다. 그 동안 CPU는 메모리 내용을 실행하려고 시도하는 것을 방지했다. 올바르게 로드되면 CPU는 부트스트래핑 코드를 실행할 수 있게 되었다. 여러 초기 미니컴퓨터에 사용된 것과 유사한 이 프로세스는 지루하고 오류가 없어야 했다.

### 집적 회로 고정 기억 장치 시대
[섬네일|[회로 기판에 장착된 인텔 2708 이피롬 "칩"]]

ROM의 도입과 마스크 프로그래밍 ROM, PROM, 이피롬, 플래시 메모리를 포함한 다양한 변형은 ROM의 물리적 크기와 비용을 줄였다. 이로 인해 펌웨어 부팅 프로그램을 컴퓨터의 일부로 포함할 수 있게 되었다.

#### 미니컴퓨터
데이터 제너럴 노바 1200 (1970) 및 노바 800 (1971)에는 프로그램 로드 스위치가 있었는데, 이 스위치는 두 개의 ROM 칩을 제공하는 옵션과 결합하여 해당 ROM 칩에서 주 기억 장치로 프로그램을 로드하고 실행했다. 디지털 이큅먼트 코퍼레이션은 집적 회로 ROM 기반 BM873 (1974), M9301 (1977), M9312 (1978), REV11-A 및 REV11-C, MRV11-C, 및 MRV11-D ROM 메모리를 도입했는데, 이들 모두 부트스트랩 ROM으로 사용 가능했다. PDP-11/34 (1976), PDP-11/60 (1977), PDP-11/24 (1979), 및 대부분의 후기 모델에는 부팅 ROM 모듈이 포함된다.

CSELT 연구원이었던 알베르토 차라멜라가 1975년에 특허를 낸 이탈리아 전화 교환 컴퓨터 "Gruppi Speciali"는 (외부) ROM을 포함했다. Gruppi Speciali는 1975년부터 반도체로 구성된 ROM 메모리에서 운영체제로 부팅되는 완전한 단일 버튼 기계였다. 비록 Gruppi Speciali의 컴퓨터에 ROM 장치가 기본적으로 내장되어 있지 않았지만, 기계의 설계로 인해 (따라서 이 "부트스트랩 장치"는 아키텍처 독립적이었다) 예를 들어 PDP-11과 같이 설계되지 않은 기계에서도 단일 버튼 ROM 부팅이 가능했다. 전원 차단 후 기계 상태를 저장하는 것도 가능했는데, 이는 전화 교환 분야에서 또 다른 중요한 기능이었다.

일부 미니컴퓨터와 슈퍼미니컴퓨터는 주 프로세서를 부트스트랩하는 별도의 콘솔 프로세서를 포함한다. PDP-11/44는 콘솔 프로세서로 인텔 8085를 사용했고, 디지털의 VAX 32비트 슈퍼미니컴퓨터 라인의 첫 번째 멤버인 VAX-11/780은 LSI-11 기반 콘솔 프로세서를 가졌다. VAX-11/730은 8085 기반 콘솔 프로세서를 가졌다. 이러한 콘솔 프로세서는 다양한 저장 장치에서 주 프로세서를 부팅할 수 있었다.

VAX-11/750과 같은 일부 다른 슈퍼미니컴퓨터는 부팅의 첫 단계를 포함한 콘솔 기능을 CPU 마이크로코드에서 구현한다.

#### 마이크로프로세서 및 마이크로컴퓨터
일반적으로 마이크로프로세서는 재설정 또는 전원 켜짐 상태 후에 "특정 주소에서 시작하는 코드를 실행하기 시작" 또는 "특정 주소에서 다중 바이트 코드를 찾아 지정된 위치로 점프하여 실행 시작" 형태의 시작 프로세스를 수행한다. 해당 마이크로프로세서를 사용하여 구축된 시스템은 이러한 특수 위치를 영구 ROM이 차지하도록 하여 시스템이 운영자 지원 없이 항상 작동을 시작한다. 예를 들어, 인텔 x86 프로세서는 항상 F000:FFF0에서 시작하는 명령을 실행하여 시작하고, MOS 6502 프로세서의 경우, 초기화는 $FFFD (MS 바이트)와 $FFFC (LS 바이트)에서 두 바이트 벡터 주소를 읽고 해당 위치로 점프하여 부트스트랩 코드를 실행함으로써 시작된다.

1976년에 출시된 애플 I은 PROM 칩을 탑재하여 상업용 컴퓨터에서 부팅 프로세스를 위해 (앨테어 8800과 같은) 전면 패널의 필요성을 없앴다. 애플의 광고에 따르면 "더 이상 스위치도, 불빛도 없습니다... PROM의 펌웨어는 키보드에서 (모든 것을 헥스 코드로) 프로그램을 입력, 표시 및 디버그할 수 있게 합니다."

당시에는 고정 기억 장치가 비쌌기 때문에, 애플 II는 매우 작은 단계들을 연속적으로 사용하여 디스크 운영체제를 부팅했으며, 각 단계는 점진적으로 더 복잡한 부팅 프로세스의 다음 단계로 제어를 넘겼다. (자세한 내용은 애플 도스: 부트 로더 참조) 디스크 운영체제의 극히 일부만이 ROM에 의존했기 때문에, 하드웨어는 매우 유연하여 광범위한 맞춤형 디스크 복사 방지 메커니즘을 지원했다. (자세한 내용은 소프트웨어 크래킹: 역사 참조)

일부 운영체제, 특히 애플의 1995년 이전 매킨토시 시스템은 하드웨어와 너무 밀접하게 엮여 있어서 표준 운영체제 외에는 다른 운영체제를 기본적으로 부팅하는 것이 불가능했다. 이는 위에서 언급한 스위치를 사용하는 시나리오의 정반대 극단으로, 매우 융통성이 없지만 모든 하드웨어가 정상적으로 작동하는 한 비교적 오류 방지 및 바보 방지가 된다. 이러한 상황에서 일반적인 해결책은 표준 OS에 속하는 프로그램으로 작동하여 시스템을 가로채고 다른 OS를 로드하는 부트 로더를 설계하는 것이다. 이 기술은 애플이 A/UX 유닉스 구현에 사용했고, 다양한 프리웨어 운영체제와 BeOS Personal Edition 5에서도 복제되었다.

아타리 ST 마이크로컴퓨터와 같은 일부 기계는 운영체제가 ROM에서 실행되면서 "즉시 켜지는" 방식이었다. 따라서 OS를 보조 또는 3차 저장소에서 검색하는 것은 부트스트래핑의 특징적인 작업에서 제외되었다. 시스템 사용자 지정, 액세서리 및 기타 지원 소프트웨어가 자동으로 로드될 수 있도록, 아타리의 플로피 드라이브는 부팅 프로세스 중에 추가 구성 요소를 위해 읽혀졌다. 시스템이 추가 구성 요소를 검색하는 동안 플로피를 수동으로 삽입할 시간을 제공하는 시간 제한 지연이 있었다. 이는 빈 디스크를 삽입하여 피할 수 있었다. 아타리 ST 하드웨어는 또한 아타리의 전자 게임 제작 유산에서 이어져 내려온 게임 목적으로 카트리지 슬롯이 기본 프로그램 실행을 제공할 수 있도록 설계되었다. Spectre GCR 카트리지를 매킨토시 시스템 ROM과 함께 게임 슬롯에 삽입하고 아타리를 켜면, 아타리 자체 TOS 대신 매킨토시 운영체제를 "기본적으로 부팅"할 수 있었다.

IBM PC에는 바이오스라고 불리는 ROM 기반 펌웨어가 포함되어 있었다. 이 펌웨어의 기능 중 하나는 컴퓨터 전원이 켜질 때 POST(Power-On Self-Test)를 수행한 다음, 부팅 장치에서 소프트웨어를 읽어 실행하는 것이었다. IBM PC의 BIOS와 호환되는 펌웨어는 IBM PC 호환기종 컴퓨터에서 사용된다. UEFI는 인텔이 원래 아이테니엄 기반 기계를 위해 개발했으며, 나중에 인텔 프로세서를 사용하는 애플 맥을 포함한 X86 기반 기기에서 바이오스의 대안으로도 사용되었다.

유닉스 워크스테이션은 원래 벤더별 ROM 기반 펌웨어를 가졌다. 썬 마이크로시스템즈는 나중에 포스 인터프리터를 통합한 오픈 펌웨어를 개발했으며, 대부분의 펌웨어는 포스로 작성되었다. 이는 IEEE 표준 로 표준화되었다. 이 표준을 구현하는 펌웨어는 파워PC 기반 매킨토시와 일부 다른 파워PC 기반 기기, 그리고 썬 자체의 SPARC 기반 컴퓨터에서 사용되었다. Advanced RISC Computing 사양은 또 다른 펌웨어 표준을 정의했으며, 이는 일부 MIPS 아키텍처 기반 및 DEC 알파 기반 기기와 SGI Visual Workstation x86 기반 워크스테이션에서 구현되었다.

## 최신 부트 로더<span class="anchor" id="Boot-loader"></span>

컴퓨터가 꺼지면 운영체제, 응용 프로그램 코드 및 데이터를 포함한 소프트웨어는 비휘발성 메모리에 저장된다. 컴퓨터 전원이 켜지면 일반적으로 RAM에 운영체제나 로더가 없다. 컴퓨터는 먼저 ROM (나중에는 EEPROM, NOR 플래시)에 저장된 비교적 작은 프로그램을 실행하여 엑시큐트 인 플레이스를 지원하고, CPU와 마더보드를 초기화하며, 메모리 (특히 x86 시스템에서)를 초기화하고, 운영체제 프로그램과 데이터를 RAM에 로드할 수 있는 스토리지 (일반적으로 블록 주소 지정 장치, 예를 들어 하드 디스크 드라이브, 낸드 플래시, 솔리드 스테이트 드라이브)에 접근하며, 다른 I/O 장치를 초기화한다.

이 시퀀스를 시작하는 작은 프로그램을 부트스트랩 로더, 부트스트랩 또는 부트 로더라고 한다. 종종 여러 단계의 부트 로더가 사용되는데, 이 과정에서 점점 더 복잡한 여러 프로그램이 체인 로딩 프로세스를 통해 차례로 로드된다.

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

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

부트 로더는 특이한 제약에 직면할 수 있는데, 특히 크기에 있어서 그렇다. 예를 들어, IBM PC 및 호환 기종에서 부팅 코드는 MBR과 PBR에 들어가야 하며, 이는 단일 섹터로 제한된다. IBM 시스템/360에서는 크기가 IPL 매체(예: 천공 카드 크기, 트랙 크기)에 의해 제한된다.

이러한 제약이 있는 시스템에서 RAM에 로드되는 첫 번째 프로그램은 운영 체제를 로드하기에 충분히 크지 않을 수 있으며, 대신 더 큰 다른 프로그램을 로드해야 한다. RAM에 로드되는 첫 번째 프로그램을 1단계 부트 로더(first-stage boot loader)라고 하며, 이 프로그램이 로드하는 프로그램을 2단계 부트 로더(second-stage boot loader)라고 한다. 많은 임베디드 CPU에서, 종종 0단계 부트 로더라고 불리는 CPU 내장 부트 ROM은 1단계 부트 로더를 찾아 로드할 수 있다.

### 1단계 부트 로더
1단계(하드웨어 초기화 단계) 부트 로더의 예로는 바이오스, UEFI, 코어부트, Libreboot 및 Das U-Boot가 있다. IBM PC에서 마스터 부트 레코드 (MBR) 및 파티션 부트 레코드 (PBR)의 부트 로더는 최소 32KB (나중에는 64KB)의 시스템 메모리를 요구하고 원래 8088/8086 프로세서가 지원하는 명령만 사용하도록 코딩되었다.

### 2단계 부트 로더

shim, GNU GRUB, rEFInd, BOOTMGR, Syslinux, 그리고 NTLDR과 같은 2단계(OS 초기화 단계) 부트 로더는 그 자체가 운영 체제는 아니지만, 운영 체제를 적절히 로드하고 실행을 전달할 수 있다. 운영 체제는 그 후 자체적으로 초기화하고 추가 장치 드라이버를 로드할 수 있다. 2단계 부트 로더는 자체 작동을 위한 드라이버가 필요하지 않지만, 대신 바이오스, UEFI 또는 오픈 펌웨어와 같은 시스템 펌웨어에서 제공하는 일반적인 저장소 접근 방법을 사용할 수 있으며, 일반적으로 제한된 하드웨어 기능과 낮은 성능을 갖는다.

많은 부트 로더(GNU GRUB, rEFInd, Windows의 BOOTMGR, Syslinux, Windows NT/2000/XP의 NTLDR 등)는 사용자에게 여러 부팅 선택지를 제공하도록 구성할 수 있다. 이러한 선택지에는 다른 운영 체제(듀얼 또는 멀티 부팅을 위한 다른 파티션 또는 드라이브), 동일한 운영 체제의 다른 버전(새 버전에서 예상치 못한 문제가 발생할 경우), 다른 운영 체제 로딩 옵션(예: 복구 또는 안전 모드로 부팅), 그리고 운영 체제 없이 작동할 수 있는 일부 독립 실행형 프로그램(예: 메모리 테스터(memtest86+)), 기본 셸(GNU GRUB에서와 같이), 또는 심지어 게임(List of PC Booter games)이 포함될 수 있다. 일부 부트 로더는 다른 부트 로더를 로드할 수도 있다. 예를 들어, GRUB은 Windows를 직접 로드하는 대신 BOOTMGR을 로드한다. 일반적으로 기본 선택지는 시간 지연과 함께 미리 선택되며, 이 시간 동안 사용자는 키를 눌러 선택지를 변경할 수 있다. 이 지연 후에는 기본 선택지가 자동으로 실행되어 상호 작용 없이 정상적인 부팅이 이루어질 수 있다.

부팅 프로세스는 컴퓨터가 사용자와 상호작용할 준비가 되거나, 운영체제가 시스템 프로그램이나 응용 프로그램을 실행할 수 있을 때 완료된 것으로 간주될 수 있다.

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

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

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

### 네트워크 부팅

대부분의 컴퓨터는 컴퓨터 네트워크를 통해서도 부팅이 가능하다. 이 시나리오에서는 운영체제가 서버의 디스크에 저장되며, 특정 부분이 단순 파일 전송 프로토콜 (TFTP)과 같은 간단한 프로토콜을 사용하여 클라이언트로 전송된다. 이러한 부분이 전송된 후에는 운영체제가 부팅 프로세스의 제어를 넘겨받는다.

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

## IBM 호환 개인용 컴퓨터 (PC)
### 부팅 장치

[섬네일|[윈도우 투 고 부팅 가능한 플래시 드라이브, 라이브 USB 예시|link=윈도우 투 고]]

부팅 장치는 운영체제가 로드되는 저장 장치이다. 최신 PC의 UEFI 또는 바이오스 펌웨어는 다양한 장치에서 부팅을 지원하는데, 일반적으로 GPT 또는 MBR을 통한 로컬 솔리드 스테이트 드라이브 또는 하드 디스크 드라이브, El Torito를 사용하는 광학 디스크 드라이브, USB 대용량 저장 장치 (USB 플래시 드라이브, 메모리 카드 리더, USB 하드 디스크 드라이브, USB 광학 디스크 드라이브, USB 솔리드 스테이트 드라이브 등), 또는 PXE를 사용하는 네트워크 인터페이스 카드 등이 있다. 구식의 덜 일반적인 BIOS 부팅 가능 장치로는 플로피 디스크 드라이브, 집 드라이브, LS-120 드라이브 등이 있다.

일반적으로 시스템 펌웨어(UEFI 또는 BIOS)는 사용자가 부팅 순서를 구성할 수 있도록 한다. 만약 부팅 순서가 "첫째, DVD 드라이브; 둘째, 하드 디스크 드라이브"로 설정되어 있다면, 펌웨어는 DVD 드라이브에서 부팅을 시도하고 (예: 드라이브에 DVD가 없어서) 실패하면 로컬 하드 디스크 드라이브에서 부팅을 시도한다.

예를 들어, 하드 드라이브에 Windows가 설치된 PC에서 사용자는 위에서 주어진 부팅 순서를 설정한 다음 리눅스 라이브 CD를 삽입하여 하드 드라이브에 운영 체제를 설치할 필요 없이 리눅스를 시험해 볼 수 있다. 이는 듀얼 부팅의 한 예인데, 사용자는 컴퓨터가 POST(Power-On Self-Test)를 수행한 후 시작할 운영 체제를 선택한다. 이 듀얼 부팅 예시에서 사용자는 컴퓨터에서 DVD를 삽입하거나 제거하여 선택하지만, 선택된 장치의 부트 매니저 메뉴에서 선택하거나, 컴퓨터 키보드를 사용하여 바이오스 또는 UEFI 부팅 메뉴에서 선택하거나, 또는 둘 다 사용하는 것이 더 일반적이다. 부팅 메뉴는 일반적으로 POST 중에  또는  키를 눌러 진입하며, BIOS 설정은 일반적으로 POST 중에  또는  키를 눌러 진입한다.

사용자가 인터넷 접속과 같은 다양한 간단한 작업을 위해 일반적으로 리눅스의 변형인 OS로 빠른 부팅을 가능하게 하는 몇 가지 장치가 있다. 예를 들어 Splashtop과 Latitude ON이 있다.

### 부팅 순서
[섬네일|[FreeBSD의 boot0 MBR Hex dump]]
[섬네일|[어워드 소프트웨어|Award Software 바이오스 (2000년) 부팅 중]]

시작 시 IBM 호환 PC의 X86 CPU는 리얼 모드에서 리셋 벡터(세그먼트:오프셋 의 물리적 메모리 주소와 32비트 및 64비트 x86 프로세서의 )에 있는 명령어를 실행하며, 이는 일반적으로 ROM 내의 펌웨어(UEFI 또는 바이오스) 진입점을 가리킨다. 이 메모리 위치는 일반적으로 실행을 펌웨어(UEFI 또는 바이오스) 시작 프로그램의 위치로 전송하는 점프 명령어를 포함한다. 이 프로그램은 POST(Power-On Self-Test)를 실행하여 주기억장치 (DRAM), PCI 버스 및 PCI 장치(내장 옵션 롬 실행 포함)와 같은 필수 장치를 확인하고 초기화한다. 가장 복잡한 단계 중 하나는 SPD를 통해 DRAM을 설정하는 것인데, 이 시점에서는 메모리가 매우 제한적이기 때문에 더욱 복잡하다.

필수 하드웨어 초기화 후, 펌웨어(UEFI 또는 바이오스)는 미리 구성된 비휘발성 메모리 장치 목록("부팅 장치 순서")을 순회하며 부팅 가능한 장치를 찾을 때까지 탐색한다.

#### BIOS
바이오스는 부팅 가능한 장치를 찾으면 부트 섹터를 선형 주소  (일반적으로 세그먼트:오프셋 :이지만, 일부 BIOS는 잘못하여 :를 사용한다)로 로드하고 부팅 코드로 실행을 전달한다. 하드 디스크의 경우 이를 마스터 부트 레코드 (MBR)라고 한다. 일반적인 MBR 코드는 MBR의 파티션 테이블에서 부팅 가능으로 설정된 파티션을 확인한다. 활성 파티션이 발견되면 MBR 코드는 해당 파티션에서 볼륨 부트 레코드 (VBR)라고 알려진 부트 섹터 코드를 로드하고 실행한다. MBR 부팅 코드는 종종 운영 체제에 특화된다.

부팅 가능한 MBR 장치는 읽을 수 있는 장치이며, 첫 번째 섹터의 마지막 두 바이트에 리틀 엔디언 워드 (디스크에는 바이트 시퀀스 , 로 존재하며, 이는 MBR 부팅 서명으로도 알려져 있다)가 포함되어 있거나, 해당 섹터 내의 코드가 x86 PC에서 실행 가능하다는 것이 다른 방식으로 확립된 장치로 정의된다.

부트 섹터 코드는 1단계 부트 로더이다. 이는 고정 디스크 및 이동식 드라이브에 위치하며, 기본 64바이트 파티션 테이블과 4개의 파티션 항목, 그리고 적절한 부트 로더를 위해 바이오스가 요구하는 2바이트 MBR 부팅 서명을 위한 공간을 남기기 위해 마스터 부트 레코드의 첫 446 바이트 내에 들어가야 한다. 추가 기능(예: 16바이트씩 최대 16개의 파티션 항목), MBR 디스크 서명 (6바이트), MBR 디스크 타임스탬프 (6바이트), Advanced Active Partition (18바이트) 또는 특수 멀티 부팅 로더가 일부 환경에서 지원되어야 하는 경우에는 더 적은 공간이 필요할 수 있다. 플로피 및 슈퍼플로피 볼륨 부트 레코드에서, FAT12 및 FAT16 볼륨에서는 DOS 4.0부터 확장 바이오스 파라미터 블록에 최대 59바이트가 할당되며, DOS 7.1과 함께 도입된 FAT32 EBPB는 심지어 87바이트를 요구하므로, 섹터 크기가 512바이트라고 가정할 때 부트 로더를 위해 423바이트만 남는다. 따라서 마이크로소프트 부트 섹터는 전통적으로 부팅 프로세스에 특정 제약을 두었는데, 예를 들어 부팅 파일은 파일 시스템의 루트 디렉토리에 고정된 위치에 연속적인 섹터로 저장되어야 했다. 이 조건은 `[[SYS (DOS 명령어)|SYS]]` 명령에 의해 처리되었으며, DOS의 후기 버전에서 약간 완화되었다. 부트 로더는 그 다음 파일의 처음 세 섹터를 메모리로 로드할 수 있었는데, 이는 파일의 나머지를 메모리로 로드할 수 있는 또 다른 내장 부트 로더를 포함했다. 마이크로소프트가 LBA 및 FAT32 지원을 추가했을 때, 그들은 크기상의 이유로 두 개의 물리적 섹터에 걸쳐 386 명령어를 사용하는 부트 로더로 전환했다. 동시에 다른 벤더들은 최소한의 사용 가능한 메모리(32KB) 및 프로세서 지원()에 대한 원래 제약을 완화하지 않고도 단일 부트 섹터에 훨씬 더 많은 기능을 집어넣을 수 있었다. 예를 들어, DR-DOS 부트 섹터는 FAT12, FAT16 및 FAT32 파일 시스템에서 부팅 파일을 찾고, 파일이 고정된 위치에 연속적인 섹터로 저장되어 있지 않더라도 CHS 또는 LBA를 통해 전체를 메모리로 로드할 수 있다.

VBR은 종종 OS별로 다르지만, 주요 기능은 활성 파티션에서 운영체제 부트 로더 파일(예:  또는 )을 로드하고 실행하는 것이며, 이것이 2단계 부트 로더이다. 그런 다음 부트 로더는 저장 장치에서 OS 커널을 로드한다.

활성 파티션이 없거나 활성 파티션의 부트 섹터가 유효하지 않으면 MBR은 보조 부트 로더를 로드할 수 있으며, 이 로더는 파티션을 선택하고 (종종 사용자 입력을 통해) 해당 부트 섹터를 로드하여 일반적으로 해당 운영 체제 커널을 로드한다. 어떤 경우에는 MBR이 활성 파티션을 부팅하기 전에 보조 부트 로더를 로드하려고 시도할 수도 있다. 모든 시도가 실패하면 INT 18h 바이오스 인터럽트 호출을 발행하고 (INT 18h가 반환할 경우를 대비하여 INT 19h를 이어서 발행), 바이오스로 제어를 돌려준다. 그러면 BIOS는 다른 장치에서 부팅을 시도하거나 네트워크를 통한 원격 부팅을 시도한다.

#### UEFI
많은 최신 시스템(인텔 맥 및 최신 개인용 컴퓨터)은 UEFI를 사용한다.

바이오스와 달리 UEFI (CSM을 통한 **레거시 부팅** 아님)는 부트 섹터에 의존하지 않고, USB 디스크 또는 EFI 시스템 파티션에 있는 부트 로더(**EFI 응용 프로그램** 파일)를 직접 로드한다. 그리고 OS 커널은 부트 로더에 의해 로드된다.

## SoCs, 임베디드 시스템, 마이크로컨트롤러 및 FPGA

[right|섬네일|[안드로이드 (운영체제)|안드로이드 기기의 언락된 부트 로더, 추가 사용 가능한 옵션을 보여준다.]]

많은 최신 CPU, SoC 및 마이크로컨트롤러(예: TI OMAP) 또는 때로는 디지털 신호 처리 장치 (DSP)에도 부트 ROM이 실리콘에 직접 통합되어 있어, 이러한 프로세서는 자체적으로 간단한 부팅 시퀀스를 수행하고 NAND 플래시 또는 eMMC와 같은 부팅 소스에서 부팅 프로그램(펌웨어 또는 소프트웨어)을 로드할 수 있다. 이러한 장치를 처리하는 데 필요한 모든 논리를 하드웨어에 직접 연결하는 것은 어렵기 때문에, 이러한 시나리오에서는 통합 부트 ROM이 대신 사용된다. 또한, 부트 ROM은 UART, SPI, USB 등과 같은 직렬 인터페이스를 통해 부트 로더 또는 진단 프로그램을 로드할 수 있다. 이 기능은 종종 시스템 복구 목적으로 사용되거나, 비휘발성 메모리에 소프트웨어가 아직 없는 경우 초기 비휘발성 메모리 프로그래밍에 사용될 수도 있다. 많은 최신 마이크로컨트롤러(예: USB 플래시 드라이브의 플래시 메모리 컨트롤러)는 펌웨어 ROM이 실리콘에 직접 통합되어 있다.

일부 임베디드 시스템 설계에는 중간 부팅 시퀀스 단계가 포함될 수도 있다. 예를 들어, Das U-Boot는 두 단계로 나뉠 수 있다. 플랫폼은 U-Boot의 간소화된 버전인 작은 SPL(Secondary Program Loader)을 로드하고, SPL은 일부 초기 하드웨어 구성(예: RAM으로 CPU 캐시를 사용한 DRAM 초기화)을 수행하고 더 크고 완전한 U-Boot 버전을 로드한다. 일부 CPU 및 SoC는 부팅 과정에서 CPU 캐시를 RAM으로 사용하지 않을 수 있으며, 비용 절감을 위해 통합된 부팅 프로세서를 사용하여 일부 하드웨어 구성을 수행한다.

JTAG과 같은 하드웨어 디버그 인터페이스를 사용하여 시스템을 제어하는 것도 가능하다. 이러한 인터페이스는 프로세서 코어에 비휘발성 메모리를 프로그래밍하는 데 필요한 작업을 수행하도록 지시하여 부팅 가능한 비휘발성 메모리(예: 플래시)에 부트 로더 프로그램을 기록하는 데 사용될 수 있다. 또는 디버그 인터페이스를 사용하여 일부 진단 또는 부팅 코드를 RAM에 업로드한 다음 프로세서 코어를 시작하고 업로드된 코드를 실행하도록 지시할 수 있다. 이를 통해 예를 들어, 지원되는 부팅 장치에 소프트웨어가 남아 있지 않고 프로세서에 통합된 부트 ROM이 없는 임베디드 시스템을 복구할 수 있다. JTAG는 표준이자 인기 있는 인터페이스이며, 많은 CPU, 마이크로컨트롤러 및 기타 장치가 JTAG 인터페이스를 사용하여 제조된다().

일부 마이크로컨트롤러는 시스템을 임의로 제어하거나 코드를 직접 실행할 수는 없지만, 간단한 프로토콜을 통해 부팅 가능한 비휘발성 메모리(예: 플래시 메모리)에 부팅 코드를 삽입할 수 있는 특수 하드웨어 인터페이스를 제공한다. 그런 다음 제조 단계에서 이러한 인터페이스는 부팅 코드(및 기타 코드)를 비휘발성 메모리에 주입하는 데 사용된다. 시스템 재설정 후, 마이크로컨트롤러는 일반적인 프로세서가 ROM을 사용하여 부팅하는 것처럼 비휘발성 메모리에 프로그램된 코드를 실행하기 시작한다. 가장 주목할 만한 것은 아트멜 AVR 마이크로컨트롤러 및 기타 마이크로컨트롤러에서도 이 기술이 사용된다는 것이다. 많은 경우 이러한 인터페이스는 하드와이어드 로직으로 구현된다. 다른 경우에는 온칩 부트 ROM에 통합된 소프트웨어가 GPIO 핀에서 실행되어 이러한 인터페이스를 생성할 수 있다.

대부분의 DSP는 직렬 모드 부팅과 병렬 모드 부팅(예: 호스트 포트 인터페이스(HPI 부팅))을 가지고 있다.

DSP의 경우 종종 시스템 설계에 두 번째 마이크로프로세서 또는 마이크로컨트롤러가 존재하며, 이는 전체 시스템 동작, 인터럽트 처리, 외부 이벤트 처리, 사용자 인터페이스 등을 담당하는 반면, DSP는 신호 처리 작업에만 전념한다. 이러한 시스템에서 DSP는 호스트 프로세서라고도 불리는 다른 프로세서에 의해 부팅될 수 있다(호스트 포트의 이름을 따서). 이러한 프로세서는 또한 종종 마스터라고 불리는데, 이는 일반적으로 자체 메모리에서 먼저 부팅한 다음, DSP 부팅을 포함한 전체 시스템 동작을 제어하고, 그 다음 DSP의 동작을 제어하기 때문이다. DSP는 종종 자체 부팅 메모리가 없으므로 호스트 프로세서가 필요한 코드를 공급하는 데 의존한다. 이러한 설계의 가장 주목할 만한 시스템은 휴대폰, 모뎀, 오디오 및 비디오 플레이어 등으로, DSP와 CPU/마이크로컨트롤러가 함께 존재한다.

많은 FPGA 칩은 전원을 켜면 외부 구성 ROM(일반적으로 직렬 EEPROM)에서 구성을 로드한다.

## 보안
부팅 과정의 보안을 강화하기 위한 다양한 조치가 구현되었다. 그 중 일부는 의무적이며, 다른 일부는 최종 사용자가 비활성화하거나 활성화할 수 있다. 전통적으로 부팅은 암호학 사용을 포함하지 않았다. 보안은 제조사가 승인할 수도 있고 안 할 수도 있는 부트 로더 잠금 해제를 통해 우회될 수 있다. 최신 부트 로더는 동시성을 활용하는데, 이는 여러 프로세서 코어와 스레드를 동시에 실행할 수 있음을 의미하며, 이는 보안 부팅에 추가적인 복잡성을 더한다.

매튜 가렛은 부팅 보안이 정당한 목표를 가지고 있지만, 그 과정에서 사용자에게 적대적인 기본값을 선택한다고 주장했다.

### 조치
* UEFI 시큐어 부팅
* 안드로이드 검증 부팅
* 삼성 녹스
* 신뢰 플랫폼 모듈을 이용한 측정 부팅, "신뢰할 수 있는 부팅"이라고도 함.
* 인텔 부트가드
* 디스크 암호화
* 펌웨어 비밀번호

### 부트루프
[섬네일|right|[티피링크 라우터의 UART 콘솔로, OpenWrt가 부트루프에 갇힌 상태를 보여준다.]]

동시적이고 분산된 시스템 오브 시스템즈를 디버그할 때, **부트루프**(boot loop 또는 boot-loop라고도 씀)는 컴퓨팅 장치에서 발생하는 오류 상태의 진단 조건이다. 이러한 장치들이 부팅 프로세스를 완료하지 못하고 부팅 시퀀스가 끝나기 전에 재시작을 반복하면, 재시작이 사용자가 일반 인터페이스에 접근하는 것을 막을 수 있다.

#### 오류 상태 감지
시스템은 복구가 필요한 시점 이전에 명시적인 부트루프나 블루스크린과 같은 오류 상태를 나타낼 수 있다. 오류 상태를 감지하려면 분산 시스템의 실시간 작동을 위한 분산 이벤트 저장 및 스트림 처리 플랫폼이 필요할 수 있다.

#### 오류 상태 복구
오류 상태는 부트루프를 유발할 수 있으며, 이 상태는 이전에 정상적으로 작동하던 설정에서 잘못된 구성으로 인해 발생할 수 있다. 그 오류 상태에서 복구를 시도하면 재부팅이 시작되어 알려진 정상 상태로 돌아가려고 시도한다. 예를 들어, Windows OS 작업에서 복구 절차는 세 번 재부팅하는 것이었으며, 재부팅을 통해 사용 가능한 메뉴로 돌아가야 했다.

#### 복구 정책
복구는 SAML을 통해 지정될 수 있으며, 이는 일부 애플리케이션에 대한 SSO도 구현할 수 있다. 제로 트러스트 보안 모델에서는 SSO 세션에서 식별, 권한 부여, 인증이 분리된 관심사이다. 사이트 복구가 필요하다고 표시될 때(즉, 공항 터미널 화면에 블루스크린이 표시될 때)<efn|name=crowdstrikeBootloop}} 상황을 해결하기 위해 현장 방문이 필요할 수 있다.

#### 예시
* 윈도우 NT 4.0
* 윈도우 2000
* 윈도우 서버
* 윈도우 10
* 넥서스 5X
* 안드로이드 10: 특정 이미지를 배경 화면으로 설정할 때, SRGB에서 RGB로 변환하는 동안 반올림 오차로 인해 휘도 값이 최대 255를 초과했다. 이로 인해 매 부팅 시 SystemUI 구성 요소가 충돌했다.
* 구글 네스트 허브
* LG 스마트폰 부트루프 문제
* 2024년 7월 19일, 크라우드스트라이크의 Falcon 소프트웨어 업데이트로 인해 2024년 크라우드스트라이크 사태가 발생하여 전 세계 Windows 시스템이 부트루프 또는 복구 모드에 갇혔다.

## 같이 보기

* 
* 멀티 부팅
* 부팅 디스크
* 부트킷
* 부트 로더 비교
* 리눅스 시작 프로세스
* 매킨토시 시작
* 마이크로재부팅
* 멀티 부팅
* 네트워크 부팅
* RedBoot
* 자체 부팅 디스크
* 윈도우 시작 프로세스

## 내용주

## 각주