y0u_bat
[OS-6] OS 이미지 로딩 본문
[OS-6] OS 이미지 로딩
플로피 디스크 읽는 방법
- 섹터 = 1, 헤드 = 0, 트랙 = 0
- 섹터를 1에서 18까지 증가시키면서 읽음
- 섹터 18번까지 다 읽었으면 0번 헤드를 다 읽었으면 헤드 1증가
- 헤드 = 1, 섹터 = 1로 변경
- 섹터 1에서 18번까지 증가하면서 읽음
- 섹터 18번까지 다 읽으면 0번과 1번 헤드를 모두 읽었으므로, 트랙 1 증가
- 2번에서 5번과정을 79번 트랙까지 반복
최종 부트로더 소스코드
[ORG 0x00]
[BITS 16]
SECTION .text
jmp 0x07C0:START
total_sector_count: dw 1024
START:
mov ax,0x07C0
mov ds,ax
mov ax,0xB800
mov es,ax
mov ax,0x0000
mov ss,ax
mov sp,0xFFFE
mov bp,0xFFFE
mov si,0
clear_loop:
mov byte [es:si], 0
mov byte [es:si+1],0x0A
add si,2
cmp si,80*25*2
jl clear_loop
push MESSAGE1
push 0
push 0
call print_message
add sp, 6
push image_loading_message
push 1
push 0
call print_message
add sp, 6
reset_disk:
mov ax,0
mov dl,0
int 0x13
jc handle_disk_error
mov si, 0x1000
mov es, si
mov bx, 0x0000
mov di, word [total_sector_count]
read_data:
cmp di, 0
je read_end
sub di, 0x1
mov ah,0x2
mov al, 0x1
mov ch, byte [track_number]
mov cl, byte [sector_number]
mov dh, byte [handle_number]
mov dl, 0x0
int 0x13
jc handle_disk_error
add si, 0x0020
mov es, si
mov al, byte [ sector_number ]
add al, 0x01
mov byte [ sector_number ], al
cmp al, 19
jl read_data
xor byte [ handle_number ], 0x1
mov byte [ sector_number ], 0x1
cmp byte [ handle_number ], 0x0
jne read_data
add byte [ track_number ], 0x01
jmp read_data
read_end:
push loading_complete_message
push 1
push 20
call print_message
add sp, 6
jmp 0x1000:0x0000
handle_disk_error:
push disk_error_message
push 1
push 20
call print_message
add sp, 6
jmp $
print_message:
push bp
mov bp, sp
push es
push si
push di
push ax
push cx
push dx
mov ax,0xB800
mov es,ax
mov ax, word [bp + 6] ; print_message(x,y,string) // x
mov si, 160
mul si
mov di, ax
mov ax, word [bp + 4] ; y
mov si, 2
mul si
add di, ax
mov si, word [bp + 8]
message_loop:
mov cl, byte [ si ]
cmp cl,0
je message_end
mov byte [es:di],cl
add si, 1
add di, 2
jmp message_loop
message_end:
pop dx
pop cx
pop ax
pop di
pop si
pop es
pop bp
ret
MESSAGE1: db 'hello y0ubat!', 0
image_loading_message: db 'image loading.....', 0
loading_complete_message: db 'complete!!!', 0
disk_error_message: db 'disk error!!', 0
sector_number: db 0x2
handle_number: db 0x0
track_number: db 0x0
times 510 - ( $ - $$ ) db 0x00
db 0x55
db 0xAA
VirtualOS.asm
[ORG 0x00]
[BITS 16]
SECTION .text
jmp 0x1000:START
sector_count: dw 0x0000
total_sector_count: equ 1024
START:
mov ax, cs
mov ds, ax
mov ax, 0xB800
mov es, ax
%assign i 0
%rep total_sector_count
%assign i i + 1
mov ax,2
mul word [ sector_count ]
mov si, ax
mov byte [es: si + (160*2)],'0' + (i % 10)
add word [ sector_count ], 1
%if i == total_sector_count
jmp $
%else
jmp ( 0x1000 + i * 0x20): 0x0000 ; 다음 섹터 오프세으로 이동
%endif
times 512 - ( $ - $$ ) % 512 db 0x00
%endrep
00.BootLoader makefile
all: BootLoader.bin
BootLoader.bin: BootLoader.asm
nasm -o BootLoader.bin BootLoader.asm
cp BootLoader.bin Disk.img
clean:
rm -f BootLoader.bin
01.Kernel32 makefile
all: VirtualOS.bin
VirtualOS.bin: VirtualOS.asm
nasm -o VirtualOS.bin VirtualOS.asm
clean:
rm -f VirtualOS.bin
all: BootLoader Kernel32 Disk.img
MINT64 디렉토리 makefile
BootLoader:
@echo
@echo =============== Build Boot Loader ===============
@echo
make -C 00.BootLoader
@echo
@echo =============== Build Complete ===============
@echo
Kernel32:
@echo
@echo =============== Build 32bit Kernel32 ===============
@echo
make -C 01.Kernel32
@echo
@echo =============== Build Complete ===============
@echo
Disk.img: BootLoader Kernel32
@echo
@echo =============== Disk Image Build Start ===============
@echo
cat 00.BootLoader/BootLoader.bin 01.Kernel32/VirtualOS.bin > Disk.img
@echo
@echo =============== All Build Complete ===============
@echo
clean:
make -C 00.BootLoader clean
make -C 01.Kernel32 clean
rm -f Disk.img
'OS > Project' 카테고리의 다른 글
[OS-4] 운영모드와 메모리 관리 기법 (0) | 2016.10.14 |
---|---|
[OS-3] 레지스터 (0) | 2016.10.12 |
[OS-2] 운영모드 (0) | 2016.10.12 |
[OS-1] Mac OSX에서 환경구축 (0) | 2016.10.12 |
Comments