From a0c99799e8bf04747b62f1edcc3e4433f95bf7db Mon Sep 17 00:00:00 2001 From: d0p1 Date: Sat, 6 Jul 2024 15:19:35 +0200 Subject: [PATCH] feat(boot/loader): move kernel to 0x100000 --- boot/common/bootinfo.inc | 2 +- boot/common/const.inc | 1 + boot/loader/loader.asm | 10 +++++++++- boot/loader/memory.inc | 4 ++-- boot/loader/mmu.inc | 12 ++++++------ kernel/Makefile | 3 ++- kernel/bootinfo.inc | 16 ++++++++++++++++ kernel/idt.inc | 0 kernel/intro.txt | 2 +- kernel/kernel.asm | 13 ++++++++++--- kernel/mm/mm.inc | 3 ++- kernel/mm/pmm.inc | 19 ++++++++++++++++--- kernel/mm/stats.inc | 14 +++++++------- 13 files changed, 73 insertions(+), 26 deletions(-) create mode 100644 kernel/bootinfo.inc create mode 100644 kernel/idt.inc diff --git a/boot/common/bootinfo.inc b/boot/common/bootinfo.inc index 8500061..602aa14 100644 --- a/boot/common/bootinfo.inc +++ b/boot/common/bootinfo.inc @@ -10,7 +10,7 @@ struc BootInfoRange { ;; ;; StupidOS boot protocol structure struc BootInfo { - .mmap dd 4*2*40 dup(0) + .mmap dd 4*2*20 dup(0) .kernel_start dd ? .kernel_size dd ? } diff --git a/boot/common/const.inc b/boot/common/const.inc index f78dd79..917987c 100644 --- a/boot/common/const.inc +++ b/boot/common/const.inc @@ -8,6 +8,7 @@ FALSE = 0 MBR_BASE = 0x0600 BOOTSECT_BASE = 0x7C00 LOADER_BASE = 0x1000 +KERNEL_BASE = 0x100000 MULTIBOOT_BASE = 0x100000 DISK_BUFFER = 0x8000 KERNEL_PRELOAD = 0xF000 diff --git a/boot/loader/loader.asm b/boot/loader/loader.asm index 8bc4086..296398a 100644 --- a/boot/loader/loader.asm +++ b/boot/loader/loader.asm @@ -179,6 +179,12 @@ multiboot: common32: mov [0xB8000], dword 0x07690748 + ; move kernel to 0x100000 + mov ecx, [uKernelSize] + mov esi, KERNEL_PRELOAD + mov edi, KERNEL_BASE + rep movsb + ; identity map first 1MB xor esi, esi xor ecx, ecx @@ -196,7 +202,7 @@ common32: mov dword [boot_page_directory], boot_0_page_table + 0x3 ; preset and writable ; map kernel at 0xC0000000 - mov esi, KERNEL_PRELOAD + mov esi, KERNEL_BASE mov edi, boot_768_page_table xor ecx, ecx @@: @@ -225,6 +231,8 @@ common32: mov eax, STPDBOOT_MAGIC mov ebx, boot_structure + xchg bx, bx + mov ecx, 0xC0000000 jmp ecx diff --git a/boot/loader/memory.inc b/boot/loader/memory.inc index 1328ef4..7e37180 100644 --- a/boot/loader/memory.inc +++ b/boot/loader/memory.inc @@ -56,10 +56,10 @@ memory_e820_get_map: mov di, pE280AddrRange mov ecx, 20 mov eax, 0xE820 - mov edx, 0x534D4150 + mov edx, 'PAMS' int 0x15 jc .error - cmp eax, 0x534D4150 + cmp eax, 'PAMS' jne .error or ebx, ebx jz .end diff --git a/boot/loader/mmu.inc b/boot/loader/mmu.inc index baa170f..0317859 100644 --- a/boot/loader/mmu.inc +++ b/boot/loader/mmu.inc @@ -1,7 +1,7 @@ -PE_PRESENT = (1 shl 0) -PE_WRITABLE = (1 shl 1) -PE_USERMODE = (1 shl 2) -PE_ACCESSED = (1 shl 5) -PE_DIRTY = (1 shl 6) - +PE_PRESENT = (1 shl 0) +PE_WRITABLE = (1 shl 1) +PE_USERMODE = (1 shl 2) +PE_ACCESSED = (1 shl 5) +PE_DIRTY = (1 shl 6) + \ No newline at end of file diff --git a/kernel/Makefile b/kernel/Makefile index 48dfaef..7f0a316 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -7,7 +7,8 @@ SRCS = kernel.asm \ const.inc \ klog.inc \ dev/vga_console.inc \ - mm/mm.inc + mm/mm.inc \ + mm/pmm.inc .PHONY: all all: $(KERNEL) diff --git a/kernel/bootinfo.inc b/kernel/bootinfo.inc new file mode 100644 index 0000000..9bff485 --- /dev/null +++ b/kernel/bootinfo.inc @@ -0,0 +1,16 @@ + ;; File: bootinfo.inc + + ;; Struct: BootInfoRange +struc BootInfoRange { + .base dd ? + .length dd ? +} + + ;; Struct: BootInfo + ;; + ;; StupidOS boot protocol structure +struc BootInfo { + .mmap dd 4*2*20 dup(0) + .kernel_start dd ? + .kernel_size dd ? +} diff --git a/kernel/idt.inc b/kernel/idt.inc new file mode 100644 index 0000000..e69de29 diff --git a/kernel/intro.txt b/kernel/intro.txt index d56ae50..c84d34f 100644 --- a/kernel/intro.txt +++ b/kernel/intro.txt @@ -3,7 +3,7 @@ File: Introduction About: kernel memory map > -> Physical map +> Physical map virtual map > +---------------+ > | | > +---------------+ diff --git a/kernel/kernel.asm b/kernel/kernel.asm index 647aea1..0f35e13 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -19,16 +19,17 @@ db 32 dup(0) ;; EBX - Boot structure address ;; kmain: + xchg bx, bx + mov esp, stack_top cmp eax, STPDBOOT_MAGIC - jne .halt + jne .error_magic ; init memory manager ; init idt, gdt ; copy boot structure - xchg bx, bx - call vga_console_clear + ;call vga_console_clear mov [0xC03B0000], dword 0x08740953 mov [0xC03B0004], dword 0x05700675 @@ -44,12 +45,18 @@ kmain: .halt: hlt jmp $ +.error_magic: + mov esi, szErrorBootProtocol +.error: + call klog + jmp .halt include 'klog.inc' include 'dev/vga_console.inc' include 'mm/mm.inc' szMsgKernelAlive db "Kernel is alive", 0 +szErrorBootProtocol db "Error: wrong magic number", 0 align 4 stack_bottom: diff --git a/kernel/mm/mm.inc b/kernel/mm/mm.inc index 8f58973..46a6927 100644 --- a/kernel/mm/mm.inc +++ b/kernel/mm/mm.inc @@ -1,4 +1,5 @@ -free_block_head dd 0x0 + +include "pmm.inc" mm_init: ret diff --git a/kernel/mm/pmm.inc b/kernel/mm/pmm.inc index 7bd0779..74a6faf 100644 --- a/kernel/mm/pmm.inc +++ b/kernel/mm/pmm.inc @@ -1,3 +1,16 @@ -struc -{ -} + + align 4 +;aPhysPageBitmap: +; dd 32769 dup(0) + +pmm_init: + ret + +pmm_alloc_page: + ret + +pmm_free_range: + ret + +pmm_free_page: + ret diff --git a/kernel/mm/stats.inc b/kernel/mm/stats.inc index 8e6f814..311bbd2 100644 --- a/kernel/mm/stats.inc +++ b/kernel/mm/stats.inc @@ -1,7 +1,7 @@ -struc VMStat -{ - total_page dd 0 - free_pages dd 0 - used_pages dd 0 -} - +struc VMStat +{ + total_page dd 0 + free_pages dd 0 + used_pages dd 0 +} +