1. 일반정보
1.1 부트 순서의 개요
인텔 계열의 컴퓨터 시스템에 전원을 공급하면 BIOS는 OS를 부팅시키는 간단한 절차를 수행한다. BIOS는 디스크의 첫번째 물리적 섹터를
0000:7C00~0000:7DFF 사이의 메모리로 읽어들이고 이 번지로 점프(
JMP)한다.
하드 디스크에서 첫번째 물리적 섹터는 MBR(Master Boot Recode)이다. 플로피의 경우 첫번째 물리적 섹터는 부트 섹터이다. 하드 디스크는 여러 개의 논리적 드라이브로 분할될 수 있기때문에 MBR이 하드 디스크에서는 필요하다. BIOS는 MBR을 읽어야 하는는지 부트 섹터를 읽어야 하는지 알지 못한다. 하드 디스크로부터 부팅할 때 MBR은 스스로
0000:0600로 이동하며, 이때 원래의 위치(
0000:7C00)에 부트 섹터를 겹처쓴다. 플로피 드라이브(어떠한 불할영역 정보도 가지고 있지 않으며 따라서 MBR이 존재하지 않는)로부터 부팅할 때에는 단지 부트 섹터만 효과적으로 읽혀진다.
MBR은 부트 섹터에비해 훨씬 간단하다(도스 시스템에대한 두 프로그램의 ASM 소스의 예는 저자의 웨페이지로부터 구할 수 있을 것이다). 도스의 부트 섹터 프로그램은 사실 메모리의 사용가능한 512 바이트 블럭에 BIOS 데이타를 밀어넣기위해 스스로 겹쳐쓰여진다. BIOS 데이타를 저장하기위해 간단히 메모리의 다른 영역을 사용하지 않고 왜 이렇게 하는 지는 필자도 알지 못한다.
부트 섹터는 필자가 보기에 다소 엉망인 어셈블 프로그램이다. 부트 섹터 프로그램이 수행될 때 어떠한 DOS 인터럽트 핸들도 적소에 존재하지 않는다. 따라서 모든 것이 BIOS를 통해 이루어져야 한다. 부트 섹터의 실제 코드는 OS에따라 다양하게 변하지만 어떤 OS든 부트 섹터는 OS를 부팅시키려한다. 부트 섹터 프로그램은 단지 물리적 주소만 사용하며 드라이브를 접근하기위해 저수준의 BIOS 함수를 사용하기때문에 디스크의 포맷은 무의미하다.
1.2 다중 OS의 문제점
BIOS는 무턱대고 디스크의 첫번째 물리적 섹터를 읽고 이것을 수행한다. 따라서 다중 OS를 처리하는 셋업 프로그램은 부트 섹터 레벨에서 수행되어야 한다. 이것이 쉬운것 같지만 물리적 섹터는 단지 512 바이트의 크기만 갖으므로 문제가 발생한다. 이러한 이유때문에 환상적인 코드와 예쁜 메뉴를 구현할 여유가 없다. 그러나 이 말은 이것이 불가능하다는 것을 이야기하는 것은 아니다.
1.3 NTLDR
시스템이 Windows NT로 설정될 때, NT 부트 섹터가 읽혀지며 NTLDR을 수행한다. NTLDR은 OS 로더 시작 메뉴를 출력하는 프로그램이다.
BOOT.INI(BOOT.INI에대해서는 나중에 자세히 언급하겠다)에의해 지시된 파일내에 OS 부트 섹터 프로그램의 사본이 존재하는한 NTLDR로부터 임의의 OS가 읽혀지고 성공적으로 부팅될 수 있다.
Linux는 자신의 부팅하기위해 MBR을 변경한다. MBR은 부트 섹터전에 실행되어야 하기때문에 이것이 여러가지 것들을 다소 복잡하게 만든다. NTLDR 전에 Linux 부트가 호출될 수 있다. 이 문제를 해결하는 방법은 이 문서 뒷부분에서 논의될 것이다.
1.4 BOOT.INI의 형식
여기 필자의 BOOT.INI 파일이 있다.
[boot loader]
timeout=0
default=multi(0)disk(0)rdisk(0)partition(2)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINNT="도아의 NT 웍스테이션 4.0"
C:\BOOTSECT.W40 = "Windows 95" /WIN95
C:\BOOTSECT.DOS = "MS-DOS 6.20" /WIN95DOS
C:\MBR.LIN = "도아의 빨간모자 5.0"
[DoA의 BOOT.INI]
multi(0)disk(0)rdisk(0)partition(2)\WINNT="도아의 NT 웍스테이션 4.0 [안전모드]"
/basevideo /sos
multi(0)disk(0)rdisk(1)partition(1)\WINNT="도아의 NT 웍스테이션 4.0 [사본]"
C:\="M$-DOS"
Windows NT를 부팅하기위해 BOOT.INI은 WINNT40 디렉토리의 물리적 위치를 포함해야 한다. WINNT40 디렉토리는 임의의 드라이브나 파티션에 존재할 수 있다. 물론 BOOT.INI로 위치를 정확히 지시해야 한다. 이것으로 관리자는 네트웍 상의 임의의 컴퓨터의 부트 섹터를 다시 쓰지않고 NT가 읽혀지는 방법을 변경할 수 있다.
필자 시스템의 디스크 드라이브는 모두 IDE이다. 따라서 필자의 WINNT40 디렉토리는 항상 다음과 같은 형식을 갖는다.
multi(0)disk(0)rdisk(x)partition(y)\
인텔 계열의 시스템인 경우 multi()와 disk()에대한 매개변수는 항상 "0"이다. rdisk()에대한 매개변수는 WINNT40 디렉토리의 물리적 드라이브와 일치하는 값이다. partition()에대한 매개변수는 분할영역 번호을 지정한다. partition()에대한 값은 "0"이 아니라 1로부터 시작한다. 마지막으로 "dirname"은 지정된 분할영역상에 NT가 설치된 디렉토리의 이름이다.
NT외에 다른 OS는 OS를 읽기위한 부트 프로그램의 사본(512 바이트)을 생성함으로서 읽을 수 있다. Windows NT, MS-DOS와 Linux는 모두 부트 프로그램을 통해 읽혀진다. 분명한 이야기 이지만 NT 설치 디렉토리를 표시할 때와 동일한 방법으로 이들 부트 파일을 표시할 수는 없다.
C:\BOOTSECT.DOS와 C:\BOOTSECT.W40 끝의 스위치에 주의하기 바란다. 이들 스위치는 Windows 95가 스스로 부팅하기위해 이름을 변경하는 절차와 도스때문에 필요하다. 이 것은 이 문서의 뒷부분에서 논의될 것이다.
"ARC Paths" 문법이라고 부르는 것에대한 완전한 정보는 Microsoft 웹 사이트,
Microsoft KB 기사 
를 보기 바란다.