본문 바로가기

Os

MBR과 부트로더 -펌-



컴퓨터가 시작함에 있어서(예를 들어 전원을 켰을 경우 혹은 리붓되었을 경우를 위해) 반드시 초기화 프로그램이 시스템상에 존재하여, 실행되어야 합니다. 이 프로그램을 부트스트랩 프로그램이라 하는데, 이는 CPU 레지스터에서부터 각각의 장치에 이르는 시스템의 모든 구성요소를 초기화 해준 후, 운영체제를 실행시켜주는 역할을 합니다. 이를 위해서 부트스트랩 프로그램은 디스크 에서 운영체제 커널을 찾아서 메모리에 적재하고, 진입점으로 메모리를 이동(jump)시킴으로서 운영체제가 동작하도록 도와줍니다. 

대부분의 컴퓨터 상에서 부트스트랩 프로그램은 읽기전용 메모리인 'ROM'에 저장되어 있습니다. 이 특성은 별도의 메모리 초기화 과정이 필요 없으며, 위치가 고정되어 있기 때문에 시스템 시작시에 프로세서가 즉시 부트스트랩을 시작할 수 있다는 점에서 유용합니다. 그리고, ROM은 읽기 전용 메모리이기 떄문에 컴퓨터 바이러스에 의해 감염되지도 않습니다. 단, 부트스트랩 코드를 변경하기 위해서는 ROM과 하드웨어 칩을 변경해야 합니다. 그렇기 떄문에 대부분의 시스템은 아주 작은 부트스트랩 로더 프로그램을 부트 ROM에 저장하고, 대신 부트스트랩 로더를 사용하여 실질적인 부트스트랩 프로그램을 디스크에서 불러오도록 하는 방법을 사용하여 부트스트랩 프로그램이 쉽게 변경될 수 있도록 합니다. 이 실질적인 부트스트랩 프로그램은 디스크에서 특정위치에 위치한 '부트 블록'에 저장됩니다. 흔히 부트 파티션이 있는 디스크를 '부트 디스크' 혹은 '시스템 디스크'라고 부릅니다
 
부트 ROM에 있는 코드는, 디스크 컨트롤러가 부트 블록을 메모리에 적재한 후, 적재된 코드를 실행시킵니다. 이때에는 (아직)장치 드라이버가 로드되진 않습니다. 실질적인 부트스트랩 프로그램은 부트 ROM에있는 부트스트랩 로더보다 더욱 복잡한 구조를 가지며, 디스크상의 고정되지 않은 위치에서, 운영체제를 불러와 실행시킬 수 있습니다. 그렇다 하더라도, 실질적인 부트스트랩 코드는 크기가 크지 않습니다

Windows 2000의 부팅 프로세스를 예로 하여 살펴보겠습니다. Windows 2000 시스템은 부트코드를 하드디스크의 가장 처음 섹터(이를 MBR-Master Boot Record라 명명합니다)에 위치시킵니다. 그리고, Windows 2000은 하드디스크를 하나 이상의 파티션으로 나누는것을 허용합니다. 그중에서 부팅을 위해 사용되는 하나의 파티션을 부트 파티션이라 하며, 이 안에는 운영체제와 장치 드라이버가 저장됩니다. 

Windows2000시스템의 부팅은 시스템의 ROM에 있는 코드를 실행하는것으로부터 시작합니다. 이 코드는 부트 코드를 MBR에서 읽어오도록 합니다. MBR은 부트 코드 뿐만 아니라 파티션의 정보를 담는 테이블 정보도 가지고 있어서, 디스크의 어떤 파티션에서 시스템이 부팅될지를 결정히는 flag 또한 가지고 있습니다. 부트 파티션이 확인되면, ROM 코드(부트로더)는 부트 파티션의 첫번째 섹터(이를 부트섹터라 합니다)를 불러온 후 다양한 서브시스템이나 시스템 서비스등을 로드하는등의 나머지 부트 프로세스를 계속 진행합니다,

-Operating System Concepts 7th Ed, 12.5.2 Boot Block 부분 번역