From 14a9ce27abe5d855d3c1b667989f85d41a09a8e0 Mon Sep 17 00:00:00 2001 From: Recolic Keghart <root@recolic.net> Date: Tue, 9 Jun 2020 16:47:51 +0800 Subject: [PATCH] kernel working --- bootloader/boot.asm | 69 +++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/bootloader/boot.asm b/bootloader/boot.asm index ae7b822..e321a10 100644 --- a/bootloader/boot.asm +++ b/bootloader/boot.asm @@ -1,27 +1,11 @@ [bits 16] [org 0x7c00] -mov [_boot_drive_id], dl - ; Load the kernel image from boot disk, disk offset 512B to 64KB. - KERN_ADDR equ 0x7e00 - mov ah, 0x02 - mov dl, [_boot_drive_id] - mov ch, 0 - mov dh, 0 - mov cl, 2 ; from the second one, - mov al, 127 ; read 127 sectors in total. - mov bx, KERN_ADDR - int 0x13 ; Set carry on error, and set AL to sectors that actual read. +KERN_ADDR equ 0x7e00 - jc disk_io_error - mov dl, 0x7f - cmp dl, al - jne disk_io_error - ; kernel successfully loaded now! - mov bx, _motd_kern_ok - call println_bios - -jmp _init_prot_mode +mov [_boot_drive_id], dl +jmp _load_kern +; jmp _init_prot_mode %include "./str.16.inc" @@ -60,6 +44,35 @@ gdt_desc: CODE_SEG_OFFSET equ gdt_entry_1 - gdt_begin DATA_SEG_OFFSET equ gdt_entry_2 - gdt_begin +_load_kern: + ; Load the kernel image from boot disk, disk offset 512B to 64KB. + ; This is a 16bit real mode function. + mov ah, 0x02 + mov dl, [_boot_drive_id] + mov ch, 0 + mov dh, 0 + mov cl, 2 ; from the second one, + mov al, 127 ; read 127 sectors in total. + mov bx, KERN_ADDR + int 0x13 ; Set carry on error, and set AL to sectors that actual read. + + jc disk_io_error + mov dl, 0x7f + cmp dl, al + jne disk_io_error + ; kernel successfully loaded now! + mov bx, _motd_kern_ok + call println_bios + jmp _init_prot_mode + +disk_io_error: + mov bx, _motd_disk_error + call println_bios + jmp _stall + + + + _init_prot_mode: cli lgdt [gdt_desc] @@ -85,24 +98,24 @@ _prot_begin: mov ebx, _motd_32 call println_vga + ; Enter the kernel. This should never return. + call KERN_ADDR + ; Kernel returns. + mov ebx, _motd_endk + call println_vga _stall: jmp $ -disk_io_error: - mov ebx, _motd_disk_error - call println_vga - jmp _stall - _motd_disk_error: db 'DISK_IO_ERROR', 0x0 _motd_32: - db '[ENTER X86 MODE SUCC]', 0x0 + db '[LOAD KERN SUCC] [ENTER X86 MODE SUCC]', 0x0 _motd_kern_ok: - db '[ENTER X86 MODE SUCC] [LOAD KERN SUCC]', 0x0 + db '[LOAD KERN SUCC]', 0x0 _motd_endk: - db '[ENTER X86 MODE SUCC] [LOAD KERN SUCC] [KERN EXITED]', 0x0 + db '[LOAD KERN SUCC] [ENTER X86 MODE SUCC] [KERN EXITED]', 0x0 _boot_drive_id: db 0x0 -- GitLab