부트 로더를 메모리에 정상적으로 복사하려면 부트 섹터 512byte에서 마지막 2byte를 0x55와 0xAA로 저장하면 됩니다.
00.BootLoader 디렉터리에 BootLoader.asm 파일을 생성하고 아래의 사진의 내용을 입력하여 저장한 뒤 빌드(Ctrl + B)를 수행했을 때 정상적으로 빌드가 되었다면 자신의 프로젝트 최상위 디렉터리에 Disk.img 파일이 생성됩니다.
어셈블리어 코드에서 세미콜론( ; )으로 시작하여 문자열이 입력된 것은 주석이므로 입력하지 않아도 됩니다.
[ORG 0x00]
[BITS 16]
SECTION .text
jmp $
times 510 - ( $ - $$) db 0x00
db 0x55
db 0xAA
위의 NASM 어셈블리어 코드의 각 라인에 해당하는 의미는 다음과 같습니다.
→ [ORG 0x00]
● 코드의 시작 주소를 0x00으로 설정
→ [BITS 16]
● 이하의 코드는 16비트로 설정
→ SECTION .text
● text 섹션(세그먼트)을 정의
→ jmp $
● 현재 위치에서 무한 루프 수행, C언어의 'A: goto A;' 또는 'while(1);'과 같은 의미
→ jmp
● jmp 명령 다음에 오는 주소로 무조건 이동, C언어의 goto와 같은 역할
→ $
● 현재 라인의 주소를 의미
→ times 510 - ( $ - $$ ) db 0x00
● 현재 위치부터 주소가 510이 되는 시점까지 0x00으로 채우는 작업을 반복 수행
→ times
● times 명령 다음에 오는 횟수만큼 작업을 반복하라는 의미
→ $$
● 현재 주소가 포함된 섹션(.text)의 시작 주소
→ $ - $$
● 현재 섹션의 시작을 기준으로 하는 오프셋
→ db 0x00
● 현재 주소에 1byte를 선언하고 값은 0x00을 삽입하라는 의미, Define Byte의 약자
→ db
● db(1byte), dw(2byte), dd(4byte), dq(8byte) 등이 있습니다.
→ db 0x55, db 0xAA
● 주소 511에 1byte를 선언하고 값은 0x55를 삽입하고
● 주소 512에 1byte를 선언하고 값은 0xAA를 삽입함으로써 부트 섹터로 표기
위의 코드에서 실제로 의미 있는 명령은 jmp $ 뿐입니다.
나머지 명령은 주소를 정렬하고 0x55와 0xAA를 정확한 위치에 삽입하기 위해 추가된 부분입니다.
앞으로 jmp $ 부분에 코드를 추가하면서 부트 로더를 완성할 것입니다.
참고)
어셈블리어 문법에는 크게 AT&T 문법과 Intel 문법으로 나뉘는데, BX 레지스터에 AX 레지스터의 값을 복사하는 어셈블리어 명령어가 있다고 가정하면
AT&T 문법은 movw %ax, %bx 처럼 [명령어] [원본] [대상] 순서이지만
Intel 문법은 mov bx, ax 처럼 [명령어] [대상] [원본] 순서입니다.
위에서 간단하게 만들어본 부트 로더는 무한 루프를 돌기만 하고 딱히 하는 일은 없습니다.
위에서 만들어본 부트 로더를 QEMU를 이용하여 테스트하려면 우분투(Ubuntu)에서 먼저 Terminal에서 자신의 OS 프로젝트 디렉터리로 이동해줍니다.
저는 /home/sean/FS64 OS/FS64 OS 디렉터리에 생성한 디렉터리들이 있고, 빌드를 했기 때문에 Disk.img 파일이 있습니다.
이 상태에서 qemu-system-x86_64 -m 64 -fda ./Disk.img -rtc base=localtime -M pc 을(를) 입력하여 실행했을 때 아래의 두 번째 사진과 같이 플로피 디스크로 부팅한다는 메시지가 표시되고 멈추게 된다면 성공적으로 부트 로더가 실행된 것입니다.
참고)
qemu-system-x86_64 -m 64 -fda ./Disk.img -rtc base=localtime -M pc
-m 64 : 64MB 물리 메모리 할당
-fda ./Disk.img : 플로피 디스크 이미지로 자신의 OS 이미지(Disk.img) 설정
-M pc : 가상 머신을 일반 PC 환경으로 설정
부트 로더가 정상적으로 실행되지 않았을 때는 어떻게 될지 궁금하다면 부트 로더 코드 마지막에 있는 db 0x55와 db 0xAA를 db 0x00와(과) db 0x00으로 바꿔서 빌드한 뒤 qemu를 실행해보면 알 수 있습니다.(아래의 사진 참고)
'시작하지 말았어야 했던 것 > 64비트 멀티코어 OS' 카테고리의 다른 글
64비트 멀티코어 OS[4] - 1. 플로피 디스크에서 OS 이미지를 로딩 (0) | 2021.03.03 |
---|---|
64비트 멀티코어 OS[3] - 4. 화면 버퍼와 화면 제어 (0) | 2021.02.18 |
64비트 멀티코어 OS[3] - 2. Eclipse 프로젝트 생성과 Makefile 생성 (0) | 2021.02.11 |
64비트 멀티코어 OS[3] - 1. 부팅과 부트로더란 (0) | 2021.02.10 |
64비트 멀티코어 OS[2] - 2. 운영 모드와 메모리 관리 기법 (0) | 2021.02.09 |