y0u_bat

[OS-6] OS 이미지 로딩 본문

OS/Project

[OS-6] OS 이미지 로딩

유뱃 2016. 11. 3. 23:45

[OS-6] OS 이미지 로딩

플로피 디스크 읽는 방법

  1. 섹터 = 1, 헤드 = 0, 트랙 = 0
  2. 섹터를 1에서 18까지 증가시키면서 읽음
  3. 섹터 18번까지 다 읽었으면 0번 헤드를 다 읽었으면 헤드 1증가
    • 헤드 = 1, 섹터 = 1로 변경
  4. 섹터 1에서 18번까지 증가하면서 읽음
  5. 섹터 18번까지 다 읽으면 0번과 1번 헤드를 모두 읽었으므로, 트랙 1 증가
  6. 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

Imgur

'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