본문 바로가기

Security/Kernel & OS

[Operation System] 3. OS 만들기 - BootStrap - 2

1. Pre..

이번엔 Hello World 를 출력하는 부트로더를 제작해 봅시다.

  - 플로피디스크에 프로그램을 담아 부팅시켜보자.

 

2. Process

- 물리주소의 시작위치 정하기

- 'hello, world'의 메모리 공간 확보

- 비디오 서비스를 위한 BIOS 인터럽트를 걸어 화면에 출력

 

3. Code

[org 0]                         ; 물리주소 계산법 : (cs<<4)+ip+org

jmp 07c0h:start               ; 0x7c00  , far jump

start:           
    mov ax, cs                ; 0x7c05,  cs = 0x7c00 세팅
    mov ds, ax                   
    mov es, ax       
    mov si, msg

print:
    lodsb                       ; al <= [es:si], si++ 
    cmp al, 0                  ; msg 에 있는 문자열 반복 돌면서 차례대로 넣음 , 끝나면 hang 으로 점프
    je hang
    mov ah, 0Eh
    mov bx, 7
    int 10h                      ; BIOS interrupt : Video Services : http://en.wikipedia.org/wiki/BIOS_interrupt_call

    jmp print

hang:
    jmp hang

msg db 'hello, world', 0    

times 510 - ($-$$) db 0
dw 0AA55h

 

% 물리주소의 시작위치 정하기

   -  BIOS가 MBR을 읽어 램의 물리 주소 0x7c00 번지에 복사한다.

      그리고 프로그램이 메모리의 몇 번지에서 실행해야 하는지를 컴파일러에게 알려주어야 한다.

       이 선언문이 [ org 번지수 ] 이다. 

       [ org 번지수 ] 의 표기 방법에 따라 우리 프로그램은 [ org 0x7c0h ] 로 표기할수 있다. 

       그러나 [ org 0x7c0h ] 의 표기 방법보다 기준주소 + 오프셋 표기법이 주소 계산에 편리하기 때문에

       [ org 0 ] 을 사용하고 직접 실행햐야할 주소를 jmp 문을 사용해 알려준다. 

       다음과 같이 jmp 0x7cOh:start 문을 사용하여 바로 start 라벨이

      ( 또는 0x7C0h 에서 오프셋이 start 만큼 떨어진곳 ) 있는곳 부터 시작한다. 

       바이오스도 처음 점프 할때 0x0000:7C00 방식으로 점프한다. 

        그래서 CPU에 의해 자동적으로 CS(코드 세그먼트) 레지스터에는 0x0000 이,

        IP(프로그램 카운터) 레지스터에는 0x7C00이 들어 있는 상태가 된다.     

 

% 메모리 공간 확보

  - 어셈블리 문법인 데이터 정의문(data definition statement)을 사용 하여  db 'hello world', 0 표기 한다.

    마지막 0은 NULL 이다.

db -> 8 비트 정수

dw -> 16 비트 정수

dd -> 32 비트 정수 또는 실수

dq -> 64 비트 정수 또는 실수

dt -> 80 비트 10바이트 정의


% Start 가 0x5 로 바뀐 이유 

어셈을 아시는 분은 아시겠지만, 저 줄의 총 바이트 수가 5바이트 이기 때문입니다.

( 컴파일러가 바이너리에는 반영이 안됨 ) 

 

4. Run

 

 

5. Disassem

00000000  EA0500C007        jmp word 0x7c0:0x5
00000005  8CC8              mov ax,cs
00000007  8ED8              mov ds,ax
00000009  8EC0              mov es,ax
0000000B  BE1E00            mov si,0x1e
0000000E  AC                lodsb
0000000F  3C00              cmp al,0x0
00000011  7409              jz 0x1c
00000013  B40E              mov ah,0xe
00000015  BB0700            mov bx,0x7
00000018  CD10              int 0x10
0000001A  EBF2              jmp short 0xe
0000001C  EBFE              jmp short 0x1c
0000001E  68656C            push word 0x6c65
00000021  6C                insb
00000022  6F                outsw
00000023  2C20              sub al,0x20
00000025  776F              ja 0x96
00000027  726C              jc 0x95
00000029  640000            add [fs:bx+si],al
0000002C  0000              add [bx+si],al
....
000001FC  0000              add [bx+si],al
000001FE  55                push bp
000001FF  AA                stosb