From 4e8de774ef76caed41dffa19de0e90f1ec356534 Mon Sep 17 00:00:00 2001 From: slinky55 Date: Sat, 13 Jun 2026 20:43:09 -0400 Subject: [PATCH] started work on pmm --- kernel/common_stubs.S | 17 ++++++++++++++++- kernel/interrupts.c | 2 +- kernel/kmain.c | 4 ++++ kernel/memory/mm.c | 37 +++++++++++++++++++++++++++++++++++++ kernel/multiboot.h | 29 +++++++++++++++++++++++++++++ 5 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 kernel/memory/mm.c create mode 100644 kernel/multiboot.h diff --git a/kernel/common_stubs.S b/kernel/common_stubs.S index 5370460..ace90d6 100644 --- a/kernel/common_stubs.S +++ b/kernel/common_stubs.S @@ -1,4 +1,9 @@ .code32 +.section .text +.global disable_interrupts +disable_interrupts: + cli + ret .global enable_interrupts enable_interrupts: @@ -8,4 +13,14 @@ enable_interrupts: .global io_wait io_wait: outb %al, $0x80 - ret \ No newline at end of file + ret + +.global load_grub_boot_struct +load_grub_boot_struct: + mov %ebx, grub_boot_struct_ptr + +.section .bss +.align 4 +.global grub_boot_struct_ptr +grub_boot_struct_ptr: + .int 0 \ No newline at end of file diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 58a508f..d3310ca 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -21,7 +21,7 @@ const char* err_messages[32] = { [0] = "Divide by 0", [1] = "", [8] = "", - [13] = "General Protection Fault",a->i + [13] = "General Protection Fault", [14] = "Page Fault", }; diff --git a/kernel/kmain.c b/kernel/kmain.c index 3259920..681ed39 100644 --- a/kernel/kmain.c +++ b/kernel/kmain.c @@ -12,6 +12,10 @@ extern void init_pit(); extern int init_ps2(); extern void enable_interrupts(); +extern void load_grub_boot_struct(void); + +extern void* grub_boot_struct_ptr; + void kmain(void) { extern print_stream_t vga_print_stream; diff --git a/kernel/memory/mm.c b/kernel/memory/mm.c new file mode 100644 index 0000000..6b2114b --- /dev/null +++ b/kernel/memory/mm.c @@ -0,0 +1,37 @@ +#include "multiboot.h" + +static uint32_t max_address = 0; +static uint32_t total_available_memory = 0; + +void parse_mmap(void* base, uint32_t limit) { + multiboot_mmap_entry* entry = (multiboot_mmap_entry*)base; + void* end = (void*)((uint32_t)base + limit); + + while ((void*)entry < end) { + if (entry->type == 1) { + uint32_t region_start = (uint32_t)(entry->addr); + uint32_t region_end = (uint32_t)(entry->addr + entry->len); + if (region_end > max_address) { + max_address = region_end; + } + + total_available_memory += entry->len; + + // start breaking up the address range + // if it's safe (not kernel, not BIOS structures, etc..), find the corresponding page in our PMM, mark it free + // need to align start and end to 4kb + if (entry->len < 4096) { + continue; + } + + for (uint32_t addr = region_start; addr < region_end; addr += 4096) { + // check for physical kernel address range + + // check if this address range contains our multiboot structure + + // don't allow pages under 1MB + } + } + entry = (multiboot_mmap_entry*)((uint32_t)entry + entry->size + sizeof(entry->size)); + } +} \ No newline at end of file diff --git a/kernel/multiboot.h b/kernel/multiboot.h new file mode 100644 index 0000000..3d39f3d --- /dev/null +++ b/kernel/multiboot.h @@ -0,0 +1,29 @@ +#ifndef KMULTIBOOT_H +#define KMULTIBOOT_H + +#include + +typedef struct { + uint32_t flags; + uint32_t mem_lower; + uint32_t mem_upper; + uint32_t boot_device; + uint32_t cmdline; + uint32_t mods_count; + uint32_t mods_addr; + uint32_t num; + uint32_t size; + uint32_t addr; + uint32_t shndx; + uint32_t mmap_length; + uint32_t mmap_addr; +} multiboot_info; + +typedef struct __attribute__((packed)) { + uint32_t size; + uint64_t addr; + uint64_t len; + uint32_t type; +} multiboot_mmap_entry; + +#endif \ No newline at end of file