Skip to content

Latest commit

 

History

History
110 lines (70 loc) · 17.2 KB

Boot.md

File metadata and controls

110 lines (70 loc) · 17.2 KB

부팅

참고: Booting process of Windows NT - Wikipedia

부팅(booting)은 하드웨어 (예. 전원 버튼) 또는 소프트웨어 명령으로 컴퓨터를 켜는 절차이다. 부팅 초기에 전력을 공급받은 컴퓨터의 메모리휘발성이기 때문에 아무런 소프트웨어가 로드되지 않은 상태이다. 그러므로 시스템 하드웨어의 펌웨어 또는 타 프로세서의 도움으로 컴퓨터를 구동하기 위한 프로그램 이미지를 메모리에 주입시키는 작업이 필요하다.

아래는 시스템이 부팅되는 과정을 두 규격, UEFIBIOS에 대하여 순차적으로 보여주는 도표이다.

윈도우 NT 운영체제의 부팅 절차 트러블슈팅 (예시. 윈도우 10)

전원이 켜진 컴퓨터의 CPU는 리셋 벡터(reset vector)에 위치한 명령어를 가장 먼저 실행하도록 하드웨어적으로 설계되었다. x86 아키텍처 경우, 해당 위치는 리얼 모드에서 실제 메모리 주소 FFFFFFF0h(즉, 4 GB의 16 바이트 아래)로 고정되었다. 리셋 벡터는 ROM에 저장된 UEFI 혹은 BIOS 펌웨어의 진입점을 가리킨다.

UEFI 혹은 BIOS 펌웨어는 RAM에 로드되는 게 아니라, 아예 ROM을 시스템의 물리 메모리 일부로 인식하여 곧장 실행된다. 이러한 설계가 고안된 배경은 다음과 같으며, 하위호환을 위해 현재까지 이어지고 있다.[참고]

  1. 1980년대에 32비트를 지원하는 i386 등의 프로세서가 등장하였으며, 4 GB 표현 범위에 불가하였으나 당시에는 엄청난 기술이었다.
  2. RAM의 하위 1024바이트는 이미 인터럽트 벡터로 지정되어, 오히려 메모리의 최상위 주소에 ROM을 대입하는 방안이 검토되었다.

ROM에 저장된 UEFI 혹은 BIOS 펌웨어가 실행되면 가장 먼저 POST를 진행하고, 검사를 통과하면 부트로더운영체제를 로드 및 실행한다.

시동 자체 시험

시동 자체 시험(Power-on self-test; POST)은 컴퓨터나 타 디지털 전자 장치가 전원을 공급받는 즉시 실행된 (UEFI 혹은 BIOS) 펌웨어에서 하드웨어 초기화 및 상태를 진단하는 절차이다. 흔히 메인보드 제조사 또는 OEM 로고가 표시되는 화면에 해당한다. POST 진단 결과는 디스플레이 화면에 출력되거나 별도의 진단 도구로부터 확인할 수 있도록 저장된다. 만일 화면 출력 기능에 문제가 있을 경우를 대비하여 LED 또는 경고음을 통해 오류 코드를 알릴 수 있는 장치가 마련되어 있다.

부트로더

부트로더(bootloader), 일명 부트스트랩 로더(bootstrap loader)는 컴퓨터 부팅 과정 중에서 설치된 운영체제의 커널을 불러와 실행하는 프로그램이다. 만일 여럿 부팅 선택지 메뉴를 제공한다면 흔히 부트 관리자(boot manager)라고 부르며, 선택된 별개의 OS 부트로더를 실행하는 연쇄 로딩을 구현한다.

부트스트랩

부트스트랩(bootstrap)은 아무런 외부 도움을 받지 않고 자체적으로 실행하는 절차를 가리킨다. 부트스트랩의 어원은 다음과 같다:

미국 관용구 "pull yourself up by your bootstraps," 즉 스스로를 부트스트랩을 당겨 들어올린다라는 표현이 있는데 사실상 물리적으로 불가능하다. 하지만 현재는 "아무런 도움없이 어려움을 극복하고 성취하다"라는 의미로 변질되면서, 부트스트랩이란 용어가 이러한 의미를 함축하게 되었다.

컴퓨터에 전력이 공급되는 시점부터 운영체제가 로드될 때까지 자력으로 해내는 부트스트랩 과정을 일명 부팅(booting)이라 부르게 된 것이다.

BIOS

BIOS(Basic Input/Output System)는 부팅 과정에 하드웨어를 초기화 및 진단하고, 디스크에 저장된 부트로더메모리에 로드하여 운영체제커널을 실행시키는 메인보드 펌웨어이다. IBM에서 개발한 전매 소프트웨어였으나, 역설계를 성공한 이후 호환 PC 기종이 대거 생산되며 사실상 표준이 되었다. 새로운 UEFI의 등장으로, 이를 구분하기 위해 "레거시" BIOS라고 흔히 언급된다.

BIOS가 부트 장치를 탐색하는 과정은 다음과 같다.

BIOS 부팅 순서도 (개략)

리셋 벡터가 가리킨 ROM에 저장된 BIOS 펌웨어가 실행되면 먼저 POST를 진행한다. 하드웨어 초기화 및 진단을 통과하면 INT 19h를 호출하여 부트로더를 탐색, 로드, 그리고 실행하도록 한다. 부트로더가 위치한 저장 매체를 "부트 장치(boot device)"라고 부르며, BIOS가 부트로더를 탐색하는 과정은 다음과 같다:

  1. BIOS 펌웨어는 비휘발성 메모리(대표적으로 CMOS)에 저장된 BIOS 설정으로부터 부트 장치 목록을 지정한 순서대로 살펴본다.
  2. 부트 장치의 부트 섹터(즉, MBR)를 메모리로 불러오고, 만일 해당 섹터를 읽을 수 없다면 다음 부트 장치로 넘어간다.
  3. 부트 섹터를 읽을 수 있는 경우, 일부 BIOS는 마지막 두 시그니처 바이트 0x55, 0xAA까지 검증하고 부팅 장치로 인식한다.

이후 BIOS는 메모리로 불러온 부트 섹터에게 PC 제어권을 양도한다. 다만, BIOS는 시그니처 바이트를 확인하는 것 외에 부트 섹터의 내용물을 판독하지 않는다.

부트 섹터

참고: BIOS/MBR-based hard drive partitions | Microsoft Learn

부트 섹터(boot sector)는 시스템을 부팅하기 위해 필요한 코드, 즉 부트로더가 담겨있는 저장소섹터이다. 일반적으로 파티션에 포함되지 않는 디스크의 가장 첫 섹터를 가리키며, 부트 섹터를 포함한 디스크를 "부트 장치(boot device)"라고 부른다.

다음은 IBM PC 호환기종에 사용되는 부트 섹터의 유형을 소개한다:

마스터 부트 레코드

마스터 부트 레코드(master boot record; MBR)는 IBM PC 호환기종을 위한 부트 섹터의 한 유형이며, HDD 또는 SSD 등의 파티션을 나눌 수 있는 대용량 저장 매체(휴대용 포함)가 대상이다. 부트로더 뿐만 아니라, 해당 디스크의 파티션 정보도 MBR에 저장되어 있다 (최대 네 개의 주 파티션까지 지원). 하지만 MBR 파티션 크기는 512 바이트로 제한되어, 부팅 과정에 VBR이 함께 동원되기도 한다.

윈도우 NT의 경우, MBR의 부트로더는 부트 플래그가 설정된 부팅 대상의 시스템 파티션, 즉 활성 파티션(active partition)을 탐색하는 용도로 사용된다.

볼륨 부트 레코드

볼륨 부트 레코드(volume boot record; VBR)는 IBM PC 호환기종을 위한 부트 섹터의 한 유형이며, 간혹 파티션 부트 레코드(partition boot record; PBR)라고 언급되기도 한다. VBR은 다음 두 경우의 볼륨에서 찾아볼 수 있다.

  1. 파티션을 나눌 수 없는 플로피 디스크, CDDVD 등의 데이터 저장 매체의 부트 섹터가 해당한다.
  2. 파티션을 나눌 수 있는 대용량 저장 매체에서 각 파티션의 첫 번째 섹터가 해당한다. 디스크 전반의 첫 번째 섹터는 여전히 MBR로써 파티션 정보를 저장하고 있다.

윈도우 NTMBR이 활성된 시스템 파티션을 발견하였을 시, 해당 파티션의 VBR 부트로드는 시스템 파티션에 저장된 BOOTMGR 파일을 탐색 및 실행한다.

UEFI

참고: Boot and UEFI - Windows drivers | Microsoft Learn

UEFI(Unified Extensible Firmware Interface)는 BIOS의 기술적 한계를 극복하기 위해 설계된 펌웨어 구조를 정의하는 규격이다. 인텔에서 최초로 EFI 규격을 개발하였으나, 차후 UEFI 포럼이란 산업 컨소시엄에 합류하며 2006년에 UEFI 개방형 표준을 발표하였다. 대표적으로 TianoCore EDK II, Pheonix SecureCore, InsydeH2O 등이 구현되었으며, 이들을 통상 "UEFI 펌웨어"라고 부른다.

UEFI가 부트 장치를 탐색하는 과정은 다음과 같다.

UEFI 부팅 순서도 (개략)

리셋 벡터가 가리킨 ROM에 저장된 UEFI 펌웨어가 실행되면 먼저 POST를 진행한다. 하드웨어 초기화 및 진단을 통과하면 GPT로부터 EFI 시스템 파티션을 찾아 부트 관리자를 실행한다. 즉, BIOS와 달리 부트 섹터에 전혀 의존하지 않는다. 부트 관리자의 기본 경로는 /BOOT/BOOT<MACHINE_TYPE_SHORT_NAME>.EFI이며 아키텍처에 따라 괄호에는 IA32, X64, IA64, ARM 또는 AA64이 대입된다.[출처] 윈도우 NT를 포함한 일부 운영체제는 설치 시, 메인보드에 탑재되어 UEFI 펌웨어 설정을 저장하는 NVRAM에 부트 경로를 자체적으로 제작한 부트로더로 변경하기도 한다.

GUID 파티션 테이블

참고: UEFI/GPT-based hard drive partitions | Microsoft Learn

GUID 파티션 테이블(GUID Partition Table; GPT)은 파티션 유형을 GUID로 식별하는 UEFI에서 규정한 파티션 테이블의 레이아웃이다.

GUID 파티션 테이블 구도

데이터 블록을 CHS가 아닌 LBA 방식을 택한 GPT는 (LBA 0을 제외한) LBA 1을 파티션 테이블 헤더로 가지며, LBA 2부터 최소 0x4000 바이트를 파티션 진입 배열로 사용한다. 만일 한 개의 LBA가 512 바이트의 섹터와 대응한다면 실질적으로 사용 가능한 블록은 LBA 34 이상이 해당된다. GPT는 LBA 0를 사용하지 않기 때문에 MBR이 함께 공존할 수 있다; UEFI 펌웨어는 CSM으로부터 레거시 BIOS 부팅을 충분히 지원할 수 있다.

EFI 시스템 파티션

EFI 시스템 파티션(EFI system partition; ESP)은 부팅될 때 UEFI 펌웨어가 불러올 파일들이 위치한 데이터 저장 매체의 파티션이다. GUID C12A7328-F81F-11D2-BA4B-00A0C93EC93B로 식별되며 FAT 파일 시스템에 기반할 것을 UEFI는 규정한다. ESP 안에는 다음과 같은 데이터 및 파일이 저장되어 있다.

호환성 지원 모듈

호환성 지원 모듈(Compatibility Support Module; CSM)은 UEFI 펌웨어가 MBR 파티션의 디스크로부터 레거시 BIOS 모드로 부팅하는 걸 지원하는 하위호환이다. GPT가 LBA 0를 활용하지 않는 점을 이용하여 레거시 BIOS 기반의 시스템 부팅이 가능하였으며, 이를 BIOS-GPT라고 불렀다. 하지만 2020년부터 인텔은 더 이상 CSM을 지원하지 않는다고 발표하였다.

윈도우 부트 관리자

윈도우 부트 관리자(Windows Boot Manager), 또는 간략히 부트 관리자윈도우 NT부트로더이다.