볼륨 부트 레코드

**볼륨 부트 레코드**(volume boot record, **VBR**, **볼륨 부트 섹터**, **파티션 부트 레코드** 또는 **파티션 부트 섹터**는 IBM PC에서 도입된 부트 섹터의 한 유형이다. 이는 하드 디스크와 같이 분할된 데이터 기억 장치나 플로피 디스크와 같이 분할되지 않은 장치에서 발견될 수 있으며, 장치의 다른 부분에 저장된 컴퓨터 프로그램 (대개 운영체제이지만 반드시 그런 것은 아님)을 부트스트랩하기 위한 기계어 코드를 포함한다. 분할되지 않은 저장 장치에서는 장치의 첫 번째 섹터이며, 분할된 장치에서는 장치 내 개별 파티션의 첫 번째 디스크 섹터로, 전체 장치의 첫 번째 섹터는 파티션 테이블을 포함하는 마스터 부트 레코드 (MBR)이다. 볼륨 부트 레코드의 코드는 기기의 펌웨어에 의해 직접 호출되거나, 마스터 부트 레코드 또는 부트 관리자의 코드에 의해 간접적으로 호출된다. MBR과 VBR의 코드는 본질적으로 동일한 방식으로 로드된다. 부트 관리자를 통해 VBR을 호출하는 것을 체인 로딩이라고 한다. NTLDR (윈도우 XP 및 윈도우 서버 2003을 포함한 마이크로소프트의 윈도우 NT 기반 운영체제 모든 릴리스의 부트 로더)과 같은 일부 듀얼 부트 시스템은 개별 운영체제가 단일 파티션의 VBR에 설치하는 부트스트랩 코드의 복사본을 디스크 파일에 저장하고, 부트 로더가 사용자에게 부트스트랩할 운영체제를 물어본 후 관련 VBR 내용을 파일에서 로드한다. 윈도우 비스타, 윈도우 서버 2008 및 최신 버전에서는 NTLDR이 교체되었으며, 부트 로더 기능은 두 개의 새로운 구성 요소인 WINLOAD.EXE와 윈도우 비스타 시작 프로세스에 의해 제공된다. FAT12 (DOS 1.x 제외), FAT16, FAT32, HPFS 및 NTFS와 같은 파일 시스템에서 VBR은 파일 시스템의 주요 디스크 내 데이터 구조의 위치와 레이아웃을 지정하는 BIOS 매개변수 블록 (BPB)도 포함한다. (FAT VBR의 섹터 레이아웃, 다양한 FAT BPB 버전 및 그 항목에 대한 자세한 설명은 FAT 문서에서 찾을 수 있다.)
# 기술적 세부 사항

## 서명SIG
부트 섹터에 x86 CPU용 IBM PC 호환기종 부트 로더의 존재는 512바이트 이상의 섹터 크기에 대해 부트 섹터 서명(고정 오프셋 +1FEh의 55h와 +1FFh의 AAh)이라고 불리는 2바이트 16진수 시퀀스로 관례상 표시된다. 512바이트 섹터의 경우, 부트 섹터 서명은 섹터의 끝을 나타내기도 한다. 더 작거나 큰 섹터의 VBR도 실제 섹터 크기의 끝에 서명을 표시할 수 있지만, 여기에 설명된 의미는 +1FEh의 16비트 서명에만 적용된다. 이 서명은 설령 운영 체제를 실제로 로드할 수 없더라도 안전하게 실행될 수 있는 최소한의 더미 부트 로더의 존재를 나타낸다. 이는 (특정) 파일 시스템이나 운영 체제의 존재를 나타내는 것은 아니지만, 3.3 이전의 일부 구형 DOS 버전은 FAT 형식 미디어를 감지하는 과정에서 이 서명에 의존했다 (최신 버전은 그렇지 않다). 다른 플랫폼이나 CPU용 부트 코드는 이 서명을 사용해서는 안 된다. 왜냐하면 BIOS가 유효한 실행 코드를 포함하고 있다고 가정하고 부트 섹터에 실행을 전달할 때 충돌이 발생할 수 있기 때문이다. 이는 FAT12/FAT16 미디어가 매우 오래된 DOS 버전에서도 사용되어야 할 경우, 운영 체제를 포함하지 않거나 다른 플랫폼에서만 부팅 가능하도록 의도된 경우에도 서명을 유지해야 함을 의미한다. 결과적으로 최소한 x86 호환 (더미) 로더도 포함해야 한다 (비교를 위해, Atari ST 및 MSX-DOS의 FAT 예시 참조). 그럼에도 불구하고, 다른 플랫폼용 일부 미디어는 x86 호환 더미 로더 없이도 서명을 잘못 포함하여, 실제로는 검사가 100% 신뢰할 수 없다. 이 서명은 (최소한) IBM PC/AT 이후의 대부분의 시스템 BIOS에 의해 검사된다 (그러나 원래 IBM PC 및 일부 다른 기계에서는 검사되지 않는다). 더욱이, 대부분의 MBR 부트 로더도 부트 섹터에 제어를 넘기기 전에 이를 확인한다. 일부 BIOS (IBM PC/AT와 같은)는 고정 디스크/이동식 드라이브에 대해서만 검사를 수행하며, 플로피 및 슈퍼플로피의 경우 부트 섹터가 유효한 것으로 간주되기 위해 06h보다 크거나 같은 바이트로 시작하고 처음 9개의 워드가 동일한 값을 포함하지 않는 것으로 충분하며, 플로피에서 55h, AAh에 대한 명시적인 테스트를 피한다. 구형 부트 섹터 (즉, 매우 오래된 CP/M-86 및 DOS 미디어)는 성공적으로 부팅될 수 있음에도 불구하고 때때로 이 서명을 포함하지 않으므로, 일부 환경에서는 이 검사를 비활성화할 수 있다. 이는 플로피가 512바이트보다 작은 섹터 크기를 사용하도록 포맷될 수 있다는 사실도 반영한다. BIOS 또는 MBR 코드가 유효한 부트 섹터를 감지하지 못하여 부트 섹터 코드로 실행을 전달할 수 없으면, 다음 부트 장치를 시도한다. 모두 실패하면 일반적으로 오류 메시지를 표시하고 INT 18h를 호출한다. 이는 ROM에 있는 선택적 상주 소프트웨어 (ROM BASIC)를 시작하거나, 네트워크를 통해 원격 부팅을 시도하거나, 사용자 확인 후 INT 19h를 통해 시스템을 재부팅하거나, 다음 전원 켤 때까지 시스템이 부트스트랩 프로세스를 중단하게 한다. 10진수 오프셋 72에서 79까지, NTFS PBR은 파티션 UUID 볼륨 ID 일련 번호를 포함한다.
## 호출IN
VBR의 부트 코드는 BIOS가 데이터 구조 및 인터럽트를 설정하고 하드웨어를 초기화했다고 가정할 수 있다. 코드는 안정적인 작동을 위해 32KB 이상의 메모리가 있다고 가정해서는 안 된다. 더 많은 메모리가 필요한 경우 INT 12h를 통해 쿼리해야 한다. 다른 선행 부트 코드 (예: BIOS 확장 오버레이, 암호화 시스템 또는 원격 부트스트랩 로더)가 메모리의 다른 곳에도 존재할 수 있기 때문이다 (그리고 일반적으로 INT 12h 메모리를 그에 따라 줄여서 부트 섹터에서 자신을 숨기므로 MBR 및 VBR의 작업에 의해 덮어쓰여지지 않는다). BIOS 부트 사양은 64KB의 메모리를 허용하며 MBR 및 VBR을 위한 메모리 공간으로 0000h:7C00h부터 0000h:FFFFh를 명시적으로 권장한다. 부트 코드는 원래 인텔 8088 또는 8086 (원래 PC에서 사용됨)보다 더 나은 CPU를 가정해서는 안 되며, 하드웨어의 정확한 상태, 인터럽트 시스템 (인터럽트가 활성화 또는 비활성화될 수 있음) 또는 스택의 위치 및 크기에 대해 가정해서는 안 된다. 원래 IBM BIOS는 DS, ES, SS CPU 레지스터를 세그먼트 0000h로 초기화하고 초기 스택을 SS:SP = 0000h:0400h에 유지하지만, 모든 BIOS 및 MBR 코드가 이 규칙을 따르지 않으므로 이것에 의존해서는 안 된다. 아래에 언급되지 않은 레지스터는 초기화되지 않은 것으로 처리해야 한다. 직접적인 하드웨어 액세스는 일반적으로 허용되지 않는다. 디스크 매개변수 테이블 (DPT/FDPB)은 일반적으로 메모리의 0000h:0078h에 이미 설정되어 있지만, VBR은 INT 1Eh 벡터가 가리키는 DPT를 이 위치로 이동 (및 수정)해야 한다 (INT 1Eh는 인터럽트가 아니라 DPT에 대한 원거리 포인터이다). 일부 조건은 제어된 환경에서 완화될 수 있다. 예를 들어, 오늘날 일부 부트 로더는 정상 작동 시 (더 많은 메모리를 쿼리하지 않고) 128KB까지의 메모리를 사용할 수 있다고 가정하며, LBA 액세스를 사용하는 일부 부트 로더는 최소한 인텔 80188 또는 80186 CPU를 가정한다. VBR은 메모리 위치 `0000h`:`7C00h`에 로드되며, 이전 부트스트랩 로더 (즉, 일반적으로 BIOS 또는 MBR이지만, 다른 부트 로더일 수도 있음)가 CPU의 리얼 모드에서 `0000h`:`7C00h`로 점프하여 실행을 전달할 때 다음 CPU 레지스터가 설정된다. * CS:IP = `0000h`:`7C00h` (고정) 일부 Compaq BIOS는 07C0h:0000h를 대신 잘못 사용한다. 이는 리얼 모드 메모리에서 동일한 위치로 해석되지만, 비표준이며 피해야 한다. 특정 레지스터 값에 의존하거나 재배치 가능하도록 작성되지 않은 VBR 코드가 그렇지 않으면 작동하지 않을 수 있기 때문이다. * DL = 부트 드라이브 장치 (플로피 / 슈퍼플로피: `00h` = 첫 번째, `01h` = 두 번째, ..., `7Eh`; 고정 디스크 / 이동식 드라이브: `80h` = 첫 번째, `81h` = 두 번째, ..., `FEh`; 값 `7Fh` 및 `FFh`는 ROM / 원격 드라이브용으로 예약되어 있으며 디스크에서 사용해서는 안 된다). DL은 IBM BIOS뿐만 아니라 대부분의 다른 BIOS에서도 지원된다. Toshiba T1000 BIOS는 이를 제대로 지원하지 않는 것으로 알려져 있으며, 일부 구형 Wyse 286 BIOS는 하드 디스크에 대해 2보다 크거나 같은 DL 값을 사용한다. 슈퍼플로피로 구성된 USB 스틱은 일반적으로 DL = `00h` 또는 `01h`를 할당받지만, 일부 드문 BIOS는 이동식 드라이브로 구성된 USB 스틱도 DL = `80h`를 사용하는 대신 DL = `01h`로 잘못 표시한다. 전통적으로 부팅 시 BIOS에 의해 `00h` 및 `80h` 값만 전달되었으며, 많은 부트 섹터는 어쨌든 고정된 값으로 작동하도록 하드웨어적으로 연결되어 있었다. 플러그 앤 플레이 BIOS 사양 및 BIOS 부트 사양 (BBS)은 다른 장치도 부팅 가능하게 한다. 후자는 MBR 및 VBR 코드가 내부적으로 하드웨어적으로 연결된 기본값 대신 DL을 사용할 것을 권장한다. (참고. MS-DOS/PC DOS 및 OS/2 VBR은 제공된 DL 값을 무시하고 대신 확장 BIOS 매개변수 블록 (EBPB)의 오프셋 `+19h`에 저장된 값 또는 DOS 버전 3.2에서 3.31까지의 섹터 오프셋 `+1FDh`에 저장된 값을 검색한다. DR-DOS의 일부 버전은 7.02부터 DL을 사용한다. DR-DOS 7.07 VBR은 기본적으로 DL을 사용하고 BPB 값을 무시하지만, `SYS /O[:nnn]`을 사용하여 BPB 값을 사용하는 이전 동작을 다시 호출하거나 특정 부트 드라이브 장치 `nnn`을 저장하도록 강제할 수 있다. FAT32 볼륨에서 프리도스는 DL 값을 활용하며, FAT12/FAT16 볼륨에서는 BPB 값이 `FFh`로 설정된 경우에만 그렇게 한다.) * DH 비트 5 = 0: INT 13h를 통해 장치 지원; 그 외: 상관 없음 (0이어야 함). DH는 일부 IBM BIOS에서 지원된다. 일부 MBR 및 VBR 코드는 DH 값을 보존한다. 플러그 앤 플레이 BIOS 또는 BBS 지원이 있는 시스템은 DL 외에 PnP 데이터에 대한 포인터를 제공한다. * DL = 부트 드라이브 장치 (위 참조) * ES:DI = "`$PnP`" 설치 확인 구조를 가리킨다. 이 정보는 부트 로더(MBR 또는 VBR)가 BIOS 또는 메모리에 상주하는 PnP/BBS 오버레이와 적극적으로 상호 작용하여 부팅 순서 등을 구성할 수 있도록 하지만, 대부분의 표준 MBR 및 VBR은 이 정보를 무시한다. 이상적으로는 ES:DI가 전달되지만, PnP 지원 운영 체제는 일반적으로 나중에 PnP BIOS 진입점을 검색하는 대체 방법도 가지고 있으므로 대부분의 운영 체제는 이에 의존하지 않는다. ES:DI의 정보는 힌트로 사용될 수 있다. PnP BIOS 사양에 따르면 "$PnP" 설치 확인 구조는 시스템 메모리 F0000h부터 FFFFFh까지 16바이트 경계마다 ASCII 문자열 $PnP의 서명을 검색하여 찾을 수 있다. 분할된 미디어의 경우, VBR이 BIOS가 아닌 MBR (또는 다른 부트 로더)에 의해 시작될 때, 많은 구현은 DL (그리고 때로는 DH 및 ES:DI도) 외에 추가 정보를 VBR에 전달한다. * DS:SI = 활성화된 VBR에 해당하는 16바이트 MBR 파티션 테이블 항목 (재배치된 MBR 내)을 가리킨다. PC-MOS 5.1은 파티션 테이블에 부팅 가능 플래그가 설정된 파티션이 없을 때 부팅하기 위해 이에 의존한다. LOADER와 함께, 멀티유저 도스 및 REAL/32 부트 섹터는 부트 파일 (LOADER.SYS)을 찾을 수 없을 때 활성 파티션의 부트 섹터 (또는 디스크의 고정 위치에 있는 IBMBIO.LDR과 같은 다른 부트스트랩 로더)를 찾기 위해 이를 사용한다. PTS-DOS 6.5 및 S/DOS 1.0은 고급 활성 파티션 (AAP) 기능과 함께 이를 사용한다. LOADER 및 AAP 지원 외에도, DR-DOS 7.07은 이 기능을 사용하여 듀얼 CHS/LBA VBR 코드를 사용할 때 필요한 INT 13h 액세스 방법을 결정할 수 있다. OS/2, MS-DOS (7.0 이전), PC DOS (7.10까지), 및 윈도우 NT (대략 2007년까지)에 의해 설치된 MBR 코드는 이러한 시스템이 이를 사용하지 않음에도 불구하고 동일한 인터페이스를 제공한다. Windows NT 6.0 (및 이후 버전)에 의해 설치된 MBR은 다른 레지스터를 사용하므로 더 이상 이러한 확장과 호환되지 않는다. 일부 확장은 16바이트 파티션 테이블 항목 자체에만 의존하지만, 다른 확장은 전체 4개 (또는 5개 항목) 파티션 테이블도 존재해야 할 수 있다. DR-DOS 7.07에서는 MBR에서 선택적으로 확장 인터페이스를 사용하고 LOADER와 함께 사용할 수 있다. * AX = 이 확장의 존재를 나타내는 매직 서명 (`0EDCh`) * DL = 부트 드라이브 장치 (위 참조) * DS:SI = 사용된 16바이트 MBR 파티션 테이블 항목을 가리킨다 (위 참조) * ES:BX = 부트 섹터 또는 특수 "`NEWLDR`" 섹터 이미지의 시작 (일반적으로 7C00h) * CX = 예약됨 GUID 파티션 테이블 (GPT)과 함께, 향상된 디스크 드라이브 사양 (EDD) 4 하이브리드 MBR 제안은 MBR-VBR 인터페이스에 대한 또 다른 확장을 권장한다. * EAX = `54504721h` ("`!GPT`") * DL = 부트 드라이브 장치 (위 참조) * ES:DI = "`$PnP`" 설치 확인 구조를 가리킨다 (위 참조) * DS:SI = 16바이트 더미 MBR 파티션 테이블 항목 (오프셋 `+0h`의 부트 플래그와 오프셋 `+4h`의 파티션 타입을 제외한 모든 비트가 설정됨)과 추가 데이터로 구성된 하이브리드 MBR 핸드오버 구조를 가리킨다. 이는 16바이트 파티션 항목만 필요하고 전체 파티션 테이블이 필요하지 않은 경우 위의 오래된 DS:SI 확장과 부분적으로 호환된다.
# 내용주
refs= 부트 섹터의 오프셋 `+1FEh`에 있는 서명은 `55h AAh`이며, 이는 오프셋 `+1FEh`의 `55h`와 오프셋 `+1FFh`의 `AAh`이다. IBM PC 호환 기기의 맥락에서는 리틀 엔디언 표현을 가정해야 하므로, x86 프로세서용 프로그램에서는 16비트 워드 `AA55h`로 작성될 수 있지만 (순서가 바뀌었음에 유의), 빅 엔디언 표현을 사용하는 다른 CPU 아키텍처용 프로그램에서는 `55AAh`로 작성되어야 한다. 이는 책과 심지어 원래 마이크로소프트 참조 문서에서도 수없이 혼동되었기 때문에, 이 문서는 오해의 소지를 피하기 위해 오프셋 기반 바이트 단위 디스크 내 표현을 사용한다.