반응형

부트 로더를 메모리에 정상적으로 복사하려면 부트 섹터 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를 실행해보면 알 수 있습니다.(아래의 사진 참고)

 

부트로더 만들기 실패

반응형

+ Recent posts