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. 실행 결과
'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 |