티스토리 뷰

부트로더가 하는 일은 별거없다. OS 이미지를 1MB이하의 메모리로 복사하기만 하면된다.

이러한 코드는 부팅디스크의 첫번째 섹터(512byte)에 기록된다. 이를 MBR(Master Boot Record)라고 부른다.


우선은 최소한의 역할을 하는 부트로더를 만들어보자. 하는 일은 

1. BIOS에 의해 부트로더로 인식되서 메모리에 올라가고

2. 무한 루프를 돈다.

* 아직은 OS이미지 복사 기능이 없다


BIOS에 의해 부트로더로 인식되는 일은 아주 간단하다. 512바이트의 마지막 2바이트에 0x55, 0xAA를 써넣기만 하면된다.

코드는 아래와 같다. 코드는 nasm 컴파일러를 사용했다.


< BootLoader.asm >

1  [ORG 0x00]

2  [BITS 16]

3

4  SECTION    .text

5

6  jmp $

7

8  times 510 - ( $ - $$ ) db 0x00

9

10 db 0x55

11 db 0xAA 


이 코드에 대한 해설은 책에 설명되어있다. 개인적으로 6번째 줄의 코드가 이해가 되지 않았다. 이 코드는 무한루프를 도는 코드이다. '512byte를 채우기 전에 무한루프를 돌면 아무일도 하지 않을까?'라는 의문이 있었다. 이런 의문은 아래의 Disk.img라는 파일을 통해서 해결할 수 있었다. Disk.img는 위의 코드(BootLoader.asm)을 컴파일해서 얻은 디스크 이미지 파일이다.


[ 그림1. Disk.img의 hex데이터 ]


위 그림1을 보면 첫 데이터에 ebfe가 입력되어 있는데, 이것이 'jmp $'에 해당한다. 그리고 마지막엔 부트로더로 인식되기 위한 코드인 55와 aa가 입력되어 있다.


그러니까 'jmp $'에 의해서 코드가 멈춰서는게 아니라 'jmp $' 명령어, 0x00 데이터, 0x55, 0xAA 데이터가 Disk.img에 입력되는 것이다. 

그리고 00이 입력된 곳에 부트로더가 하는 역할(OS이미지 복사, 보호모드 전환)을 위한 코드가 입력될 것이다. 이러한 역할을 수행하려면 나중엔 'jmp $'를 지워야한다.


이렇게 생성된 Disk.img는 부팅되면서 메모리의 0x7C00에 복사된다. BIOS에 의해서!


[ 그림2. BootLoader의 동작과정 ]



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함