From 0a51a5e8bccfdb5e3d99438eb738a5e56ac37590 Mon Sep 17 00:00:00 2001 From: slinky55 Date: Tue, 16 Jun 2026 10:04:49 -0400 Subject: [PATCH] added memory mapping functions, created first user process pd --- kernel/boot/boot.S | 3 ++- kernel/kmain.c | 5 ++++ kernel/memory/mm.c | 60 ++++++++++++++++++++++++++++++---------------- kernel/memory/mm.h | 2 ++ 4 files changed, 49 insertions(+), 21 deletions(-) diff --git a/kernel/boot/boot.S b/kernel/boot/boot.S index 21303ab..0e41fab 100644 --- a/kernel/boot/boot.S +++ b/kernel/boot/boot.S @@ -52,4 +52,5 @@ page_directory: .long 0x00000083 .skip 3068 .long 0x00000083 - .skip 1020 \ No newline at end of file + .skip 1016 + .long (page_directory - 0xC0000000) + 0x03 \ No newline at end of file diff --git a/kernel/kmain.c b/kernel/kmain.c index 90ff2f0..284c9fb 100644 --- a/kernel/kmain.c +++ b/kernel/kmain.c @@ -21,6 +21,8 @@ void* page = NULL; extern char __kernel_start; extern char __kernel_end; +void* user_page_directories[10]; + void kmain(uint32_t magic, multiboot_info* mbi) { extern print_stream_t vga_print_stream; extern print_stream_t* kout; @@ -68,5 +70,8 @@ void kmain(uint32_t magic, multiboot_info* mbi) { init_page_tables(); kprintf("Page tables initialized\n"); + user_page_directories[0] = create_user_pd(); + kprintf("Created first user process page directory @ 0x%x\n", user_page_directories[0]); + while(1); } diff --git a/kernel/memory/mm.c b/kernel/memory/mm.c index e9c7f41..634d8b9 100644 --- a/kernel/memory/mm.c +++ b/kernel/memory/mm.c @@ -17,6 +17,8 @@ extern void disable_pae(); #define PAGE_TABLES 0xFFC00000 #define PAGE_DIRECTORY 0xFFFFF000 +#define TEMP_MAPPING_VADDR 0xE0000000 + #define PAGE_PRESENT 0x1 #define PAGE_WRITABLE 0x2 #define PAGE_USER 0x4 @@ -113,28 +115,24 @@ static void p_free_frame(void* addr) { mark_free((uint32_t)addr); } +// MODIFIES THE ACTIVE PAGE TABLE AT THE PHYSICAL ADDRESS LOADED INTO CR3 VIA RECURSIVE MAPPING static void map_page(uint32_t vaddr, uint32_t paddr, uint32_t flags) { uint32_t pde_entry = vaddr >> 22; uint32_t pte_entry = (vaddr >> 12) & 0x3FF; + uint32_t* pd = (uint32_t*)PAGE_DIRECTORY; + uint32_t* tablev = (uint32_t*)(PAGE_TABLES + (pde_entry * PAGE_SIZE)); - uint32_t* page_directory = (uint32_t*)PAGE_DIRECTORY; - if (page_directory[pde_entry] & PAGE_PRESENT == 0) { - uint32_t* new_table = (uint32_t*)p_alloc_frame(); - page_directory[pde_entry] = (uint32_t)new_table | flags; - } -} - -static void* p_alloc(uint32_t size_b, uint32_t vstart) { - uint32_t pages = (size_b + PAGE_SIZE - 1) / PAGE_SIZE; - - for (uint32_t i = 0; i < pages; i++) { - uint32_t vaddr = vstart + i * PAGE_SIZE; - uint32_t paddr = (uint32_t)p_alloc_frame(); - - map_page(vaddr, paddr, PAGE_PRESENT | PAGE_WRITABLE); + if ((pd[pde_entry] & PAGE_PRESENT) == 0) { + uint32_t new_table = (uint32_t)p_alloc_frame(); + pd[pde_entry] = new_table | PAGE_PRESENT | PAGE_WRITABLE; + flush_tlb(); + for (int i = 0; i < 1024; i++) { + tablev[i] = 0; + } } - return (void*)vstart; + tablev[pte_entry] = paddr | flags; + flush_tlb(); } void init_pmm(void* mmap_base, uint32_t mmap_limit) { @@ -158,10 +156,32 @@ void init_page_tables() { flush_tlb(); } -void* init_kheap() { - -} - uint32_t total_free_memory() { return total_available_memory; +} + +void* create_user_pd() { + uint32_t pd_address = (uint32_t)p_alloc_frame(); + if (pd_address == 0) { + return 0; + } + + map_page(TEMP_MAPPING_VADDR, pd_address, PAGE_PRESENT | PAGE_WRITABLE); + + uint32_t* user_pd = (uint32_t*)TEMP_MAPPING_VADDR; + uint32_t* kernel_pd = (uint32_t*)PAGE_DIRECTORY; + + for(int i = 0; i < 1024; i++) { + user_pd[i] = 0; + } + + user_pd[768] = kernel_pd[768]; + user_pd[1023] = (uint32_t)pd_address | PAGE_PRESENT | PAGE_WRITABLE; + + uint32_t pde = TEMP_MAPPING_VADDR >> 22; + uint32_t pte = (TEMP_MAPPING_VADDR >> 12) & 0x3FF; + uint32_t* kernel_pt = (uint32_t*)(PAGE_TABLES + (pde * PAGE_SIZE)); + kernel_pt[pte] = 0; + flush_tlb(); + return (void*)pd_address; } \ No newline at end of file diff --git a/kernel/memory/mm.h b/kernel/memory/mm.h index 355d50d..a17876a 100644 --- a/kernel/memory/mm.h +++ b/kernel/memory/mm.h @@ -13,4 +13,6 @@ void* init_kheap(); uint32_t total_free_memory(); +void* create_user_pd(); + #endif