OS/OS from Scratch

[OS] 08. 32 Bit Print

jschang 2021. 6. 21. 22:52

서론

지난 강의를 끝으로 boot sector을 구현했습니다. 이번 강의에서는 32bit protected mode에서 화면에 출력하는 기능을 구현하겠습니다. 해당 Github 강의는 다음과 같습니다.

https://github.com/cfenollosa/os-tutorial/tree/master/08-32bit-print

 

cfenollosa/os-tutorial

How to create an OS from scratch. Contribute to cfenollosa/os-tutorial development by creating an account on GitHub.

github.com


이론

32 bit protected mode

Protected 모드는 80286 이후의 인텔 CPU에서 사용하는 Opertating 모드입니다. 32bit protected 모드를 통해 가상 메모리 주소를 사용할 수 있으며 메모리와 하드웨어의 IO보호 기능을 사용할 수 있습니다. 자세한 내용은 다음 페이지를 참고하세요. https://wiki.osdev.org/Protected_Mode

VGA Memory

이번 강의부터는 BIOS Interrupt를 사용하지 않고 VGA 메모리를 설정해 화면에 문자열을 출력합니다. VGA 메모리는 0xb8000부터 시작하고, VGA 메모리에서는 문자를 2byte로 저장합니다. 2byte는 해당 문자의 ASCII코드와 색 등의 특성을 지니는 byte로 구성돼있습니다. 만약 row행 col열 픽셀에 특정 문자를 출력하고 싶으면 0xb8000 + 2*(row*(화면 세로 크기) + col)에 문자를 지정하면 됩니다.

Assembly 상수 선언

Assembly 에서 상수를 지정하는 방법은 다음과 같습니다.

<상수명> equ <값>

코드

32bit_print.asm

이번 강의의 코드는 간단해 주석에 모든 설명을 첨부했습니다.

; 32bit protected mode사용 
[bits 32]

; Assembly에서 상수 선언 방법
; VGA 메모리는 0xb8000부터 시작 
VIDEO_MEMORY equ 0xb8000
; 각 문자에 대한 색깔 지정하는 byte
WHITE_ON_BLACK equ 0x0f

print_string_pm:
    pusha
    mov edx, VIDEO_MEMORY

print_string_pm_loop:
    ; [ebx]에 출력할 문자 저장되어 있음
    mov al, [ebx]
    mov ah, WHITE_ON_BLACK

    ; 문자열의 끝인지 확인
    cmp al, 0
    je print_string_pm_done

    ; 출력할 문자와 색 정보 VGA 메모리에 저장
    mov [edx], ax
    ; 문자열에서 다음 문자
    add ebx, 1
    ; VGA 메모리는 2byte 단위로 저장됨 
    add edx, 2

    jmp print_string_pm_loop

print_string_pm_done:
    popa
    ret

실행 결과

본 강의에서는 아직 해당 코드를 boot loader에서 불러오는 것을 구현하지 않아 실행 결과를 확인할 수 없습니다. 다음 강좌에서 해당 코드를 실행시킬 수 있도록 GDT를 구현해보겠습니다.