Project/OStrial in AMAZON

#2 이제 하드디스크를 읽어봅시다 (커널 로드)

NONE_31D 2019. 9. 18. 23:51

1번 글에서 코드 설명을 하다 말긴 했는데...

남은 부분이 비디오 메모리 접근, 글자 색 설정하는 부분이라 천천히 입력하도록 하겠습니다.


앞에서 오프셋을 통해 MBR을 메모리에 올려, 비디오 메모리에 접근하여 글자를 출력할 수 있게 코드를 작성했습니다. 마지막에 매직 워드를 넣으므로써 BIOS 가 이 코드가 MBR임을 확인하게 하고. 프로그램을 마쳤습니다.

 

이번에 할 부분은 MBR을 통해 디스크의 나머지 부분을 메모리로 읽을 수 있도혹 한 후, 그 주소로 점프하도록 진행하려 합니다.


1. x86 CPU 메모리맵 

 

a. Low Memory (< 1MiB) : 커널 단에서 접근 가능한 메모리

메모리 주소 묘사
0x00000 ~ 0x004FF 리얼모드 IVT, BDA(Bios Data Area)
0x00500 ~ 0x7FFFF 자유 적재 가능한 메모리
0x80000 ~ 0x9FFFF EBDA
0xA0000 ~ 0xFFFFF Video Memory, ROM

BIOS는 실행 중에 BDA와 EBDA에 위치한 데이터를 쓰는데, 이 때문에 위에 표시된 부분을 함부로 사용해서는 안된다. EBDA는 리얼모드 종료 이후 보호모드에 들어가고 나서도 SMM(System Management Mode)에서 사용되기 때문에 절대로 덮어씌워져서는 안된다. BDA 안의 0x40E에 EBDA의 bottom 주소가 저장되어 있다.

 

IRQ(인터럽트 요청)은 먼저 시간 때문에 1초에 18번씩 BIOS에게 조작되어짐. IRQ는 IVT를 활성화시키는데, 이 때문에 부팅 내내 IVT에 접근하게 되므로 해당 메모리 부분을 유지해야 한다. 

 

 

b. High Memory(=Upper Memory, > 1MiB) : 유저 프로그램 단에서 사용, 접근 가능한 메모리.

BIOS 함수(INT 15h, EAX=0xE820)을 통해 Upper Memory의 맵을 받을 수 있다.

 


2. 코드

 

앞선 MBR을 읽었지만, 추가적인 디스크가 필요하다. 앞에서 읽었던 부분을 섹터 1이라고 한다면, 이번에 읽어올릴 부분은 섹터 2라고 하자.

 

 

소스 1. boot.asm

...더보기
[org 0]
[bits 16]
    jmp 0x07C0:start

    
    start:
        mov ax, cs ;cs : Code Segment
        mov ds, ax

        mov ax, 0xB800
        mov es, ax
        mov di, 0
        mov ax, word [msgBack]
        mov cx, 0x7FF

    
    paint:
        mov word [es:di], ax
        add di, 2
        dec cx
        jnz paint

    
    read:
        mov ax, 0x1000
        mov es, ax
        mov bx, 0

        mov ah, 2
        mov al, 1
        mov ch, 0
        mov cl, 2
        mov dh, 0
        mov dl, 0
        INT 0x13

        jc read

        jmp 0x1000:0000


    msgBack db '.', 0xE7

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

 

소스2. kernel.asm

...더보기
[org 0]
[bits 16]


start:
    mov ax, cs
    mov ds, ax
    xor ax, ax
    mov ss, ax

    lea esi, [msgKernel]
    mov ax, 0xB800
    mov es, ax
    mov edi, 0
    call printf

    jmp $


printf:
    push eax

printf_loop:
    mov al, byte [esi]
    mov byte [es:edi], al
    or al, al
    jz printf_end
    inc edi
    mov byte [es:edi], 0x06
    inc esi
    inc edi
    jmp printf_loop

printf_end:
    pop eax
    ret


msgKernel db "We ar in kernel program", 0

3. 실행 결과

 

kernel.asm에 의도했던 문자열이 출력되는 것을 볼 수 있음. 부트로더가 섹터 2까지 정상적으로 로드했음을 의미.

'Project > OStrial in AMAZON' 카테고리의 다른 글

#n 중간 건너뛰고 키보드 드라이버 처리  (0) 2019.11.24
#5 C언어로 개발하기!  (0) 2019.10.16
#4 어셈블리_함수  (0) 2019.10.16
#3 Protected Mode  (0) 2019.10.09
#1 부트로더까지 어떻게 만들어봅시다  (0) 2019.09.15