diff --git a/How_to_write_a_bootloader/Part_3/bootloader/Makefile b/How_to_write_a_bootloader/Part_3/bootloader/Makefile index 021f0d5..9661f70 100644 --- a/How_to_write_a_bootloader/Part_3/bootloader/Makefile +++ b/How_to_write_a_bootloader/Part_3/bootloader/Makefile @@ -12,6 +12,11 @@ all: dd if=./bin/kernel.bin >> ./bin/os.bin dd if=/dev/zero bs=512 count=8 >> ./bin/os.bin +qemu: + # Use 32 bit qemu when using debugger on this 32 bit OS + qemu-system-x86_64 -hda ./bin/os.bin + #qemu-system-i386 -hda ./bin/os.bin + clean: rm -f ./bin/boot.bin rm -f ./bin/kernel.bin diff --git a/How_to_write_a_bootloader/Part_3/bootloader/bin/boot.bin b/How_to_write_a_bootloader/Part_3/bootloader/bin/boot.bin index 8857245..96d39b1 100644 Binary files a/How_to_write_a_bootloader/Part_3/bootloader/bin/boot.bin and b/How_to_write_a_bootloader/Part_3/bootloader/bin/boot.bin differ diff --git a/How_to_write_a_bootloader/Part_3/bootloader/bin/kernel.bin b/How_to_write_a_bootloader/Part_3/bootloader/bin/kernel.bin old mode 100644 new mode 100755 index cdb8dce..02706a7 Binary files a/How_to_write_a_bootloader/Part_3/bootloader/bin/kernel.bin and b/How_to_write_a_bootloader/Part_3/bootloader/bin/kernel.bin differ diff --git a/How_to_write_a_bootloader/Part_3/bootloader/bin/os.bin b/How_to_write_a_bootloader/Part_3/bootloader/bin/os.bin index 8af68a9..c073d45 100644 Binary files a/How_to_write_a_bootloader/Part_3/bootloader/bin/os.bin and b/How_to_write_a_bootloader/Part_3/bootloader/bin/os.bin differ diff --git a/How_to_write_a_bootloader/Part_3/bootloader/build/completeKernel.o b/How_to_write_a_bootloader/Part_3/bootloader/build/completeKernel.o index cdbcae0..f6296c8 100644 Binary files a/How_to_write_a_bootloader/Part_3/bootloader/build/completeKernel.o and b/How_to_write_a_bootloader/Part_3/bootloader/build/completeKernel.o differ diff --git a/How_to_write_a_bootloader/Part_3/bootloader/build/kernel.asm.o b/How_to_write_a_bootloader/Part_3/bootloader/build/kernel.asm.o index 42a9f40..3afdb17 100644 Binary files a/How_to_write_a_bootloader/Part_3/bootloader/build/kernel.asm.o and b/How_to_write_a_bootloader/Part_3/bootloader/build/kernel.asm.o differ diff --git a/How_to_write_a_bootloader/Part_3/bootloader/build/kernel.o b/How_to_write_a_bootloader/Part_3/bootloader/build/kernel.o index 77c100a..4f998f1 100644 Binary files a/How_to_write_a_bootloader/Part_3/bootloader/build/kernel.o and b/How_to_write_a_bootloader/Part_3/bootloader/build/kernel.o differ diff --git a/How_to_write_a_bootloader/Part_3/bootloader/src/boot.asm b/How_to_write_a_bootloader/Part_3/bootloader/src/boot.asm index a2d73ea..4e11386 100644 --- a/How_to_write_a_bootloader/Part_3/bootloader/src/boot.asm +++ b/How_to_write_a_bootloader/Part_3/bootloader/src/boot.asm @@ -18,10 +18,17 @@ start: mov ss, ax ; Set stack segment (SS) to 0x00 mov sp, 0x7c00; Set stack pointer (SP) to 0x7c00, top of the bootloader segment sti ; Enable interrupts, allowing them to occur again + + ; set video mode, al 03h is a text mode, this also clears the screen + mov AH, 00h + mov AL, 03h + int 0x10 ;Load kernel -mov bx, KERNEL_LOAD_SEG +mov bx, KERNEL_LOAD_SEG ; Load segment +mov es, bx +mov bx, 0x0000 ; Load offset (SEG*16 + OFFSET) mov dh, 0x00 mov dl, 0x80 mov cl, 0x02 @@ -89,6 +96,13 @@ PModeMain: or al, 2 out 0x92, al + ; Copy kernel from 0x10000 to 0x100000, where we jump to, as protected mode can access past 1MB now + mov esi, 0x10000 ; Source + mov edi, KERNEL_START_ADDR ; Destination + mov ecx, 4096 ; num sectors * 512 bytes + cld + rep movsb + jmp CODE_OFFSET:KERNEL_START_ADDR diff --git a/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.asm b/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.asm index d8e5c35..c33f825 100644 --- a/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.asm +++ b/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.asm @@ -5,6 +5,6 @@ extern kernel_main _start: call kernel_main - jmp$ + jmp $ -times 512-($ - $$) db 0 \ No newline at end of file +times 510-($ - $$) db 0 \ No newline at end of file diff --git a/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.c b/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.c index 422e3a9..43824fc 100644 --- a/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.c +++ b/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.c @@ -1,5 +1,9 @@ #include "kernel.h" +#define VIDEO_MEMORY 0xb8000 + void kernel_main(){ - + unsigned char *video = (unsigned char *)VIDEO_MEMORY; + video[0] = 'H'; + video[2] = 'i'; } \ No newline at end of file diff --git a/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.h b/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.h index 846a76f..1b78527 100644 --- a/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.h +++ b/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.h @@ -1,5 +1,5 @@ -#ifndef KENREL_H -#define KENREL_H +#ifndef KERNEL_H +#define KERNEL_H void kernel_main(); diff --git a/How_to_write_a_bootloader/Part_3/bootloader/src/linkerScript.ld b/How_to_write_a_bootloader/Part_3/bootloader/src/linkerScript.ld index 895a479..4f94cc8 100644 --- a/How_to_write_a_bootloader/Part_3/bootloader/src/linkerScript.ld +++ b/How_to_write_a_bootloader/Part_3/bootloader/src/linkerScript.ld @@ -3,22 +3,22 @@ OUTPUT_FORMAT(binary) SECTIONS { . = 0x0100000; - .text : ALIGN(4096) + .text : ALIGN(16) { *(.text) } - .rodata : ALIGN(4096) + .rodata : ALIGN(16) { *(.rodata) } - .data : ALIGN(4096) + .data : ALIGN(16) { *(.data) } - .bss : ALIGN(4096) + .bss : ALIGN(16) { *(COMMON) *(.bss)