- 사람들은 복잡한 것과 단순히 복잡한 것을 구분함. 복잡성은 흥미롭다고 여겨지지만, 복잡함은 해롭다고 여겨짐. x86_64 CPU 설정 과정은 대부분 복잡함.
- BIOS에 의해 로드된 부트 섹터에서 CPU를 16비트 실모드에서 64비트 롱모드로 설정하는 방법을 설명함. 이 설정은 기본적인 것이며, 더 많은 작업이 필요함.
- Intel 64 및 IA-32 아키텍처 소프트웨어 개발자 매뉴얼, 어셈블러(nasm 사용), QEMU가 필요함. x86 어셈블리와 nasm 문법을 알고 있어야 함.
시작점: BIOS
- 리셋 후 x86 CPU는 "실모드"에 있음. 이 모드는 16비트 기본 피연산자 크기를 가짐. 세그먼테이션을 사용하여 1MB 메모리를 주소 지정할 수 있음.
- BIOS 후 첫 번째 실행 코드는 부트 섹터에 있음. BIOS는 시스템에서
0xaa55
로 끝나는 첫 번째 섹터를 찾고, 해당 부트 섹터를 메모리 주소 0x7c00
에 로드함.
- BIOS는 512바이트를 제공하며, 이를 사용하여 부트로더의 나머지 부분을 부트스트랩해야 함.
부트 섹터 설정
- 간단한 부트 섹터를 설정하여 BIOS 루틴을 사용해 화면에 메시지를 출력하고 멈추게 함. 이를 통해 도구가 작동하는지 확인할 수 있음.
- 어셈블리 코드와 Makefile을 사용하여 부트 섹터를 설정함.
1단계 – 디스크에서 2단계 로드
- 부트로더를 두 단계로 나눌 수 있음. 1단계는 부트 섹터의 코드로, BIOS가 로드하는 모든 것임. 1단계의 유일한 목적은 2단계를 메모리에 로드하는 것임.
- 2단계에서는 16비트 실모드에서 32비트 보호 모드로 전환함. 보호 모드에서는 BIOS 루틴을 사용할 수 없음. 디스크에서 섹터를 로드하는 것은 훨씬 더 복잡해짐.
- BIOS를 사용하여 디스크에 접근하는 방법을 설명함.
32비트 보호 모드
- CPU를 실모드(16비트)에서 보호 모드(32비트)로 전환함. 보호 모드에서는 세그먼테이션을 사용하여 메모리 보호를 구현함.
- 보호 모드로 전환하기 전에 글로벌 디스크립터 테이블(GDT)을 정의해야 함. GDT는 메모리에 연속적인 구조로 정의됨.
- GDT를 정의하고 보호 모드로 전환하는 방법을 설명함.
64비트 롱모드
- 롱모드로 전환하기 전에 CPU는 보호 모드에 있어야 하며 페이징이 활성화되어야 함. 보호 모드는 이미 설정되었으나 페이징이 필요함.
- 페이징은 세그먼테이션을 대체하여 가상 주소 공간, 권한 등을 관리함. 롱모드 전환을 위한 페이지 테이블을 생성하는 방법을 설명함.
- 롱모드 전환을 위한 GDT를 정의하고, 보호 모드에서 롱모드로 전환하는 방법을 설명함.
GN⁺의 정리
- 이 글은 x86_64 CPU를 16비트 실모드에서 64비트 롱모드로 설정하는 과정을 자세히 설명함. 이를 통해 부트로더와 운영체제 커널 개발에 대한 이해를 높일 수 있음.
- BIOS, 부트 섹터, 보호 모드, 롱모드 등 다양한 개념을 다루며, 각 단계별로 필요한 어셈블리 코드와 설정 방법을 제공함.
- 이 글은 운영체제 개발에 관심 있는 사람들에게 유용하며, 특히 x86 아키텍처에 대한 깊은 이해를 제공함. 비슷한 기능을 가진 프로젝트로는 "Writing a Simple Operating System – from Scratch"가 있음.