added memory mapping functions, created first user process pd

This commit is contained in:
2026-06-16 10:04:49 -04:00
parent fe3725db99
commit 0a51a5e8bc
4 changed files with 49 additions and 21 deletions

View File

@@ -52,4 +52,5 @@ page_directory:
.long 0x00000083 .long 0x00000083
.skip 3068 .skip 3068
.long 0x00000083 .long 0x00000083
.skip 1020 .skip 1016
.long (page_directory - 0xC0000000) + 0x03

View File

@@ -21,6 +21,8 @@ void* page = NULL;
extern char __kernel_start; extern char __kernel_start;
extern char __kernel_end; extern char __kernel_end;
void* user_page_directories[10];
void kmain(uint32_t magic, multiboot_info* mbi) { void kmain(uint32_t magic, multiboot_info* mbi) {
extern print_stream_t vga_print_stream; extern print_stream_t vga_print_stream;
extern print_stream_t* kout; extern print_stream_t* kout;
@@ -68,5 +70,8 @@ void kmain(uint32_t magic, multiboot_info* mbi) {
init_page_tables(); init_page_tables();
kprintf("Page tables initialized\n"); 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); while(1);
} }

View File

@@ -17,6 +17,8 @@ extern void disable_pae();
#define PAGE_TABLES 0xFFC00000 #define PAGE_TABLES 0xFFC00000
#define PAGE_DIRECTORY 0xFFFFF000 #define PAGE_DIRECTORY 0xFFFFF000
#define TEMP_MAPPING_VADDR 0xE0000000
#define PAGE_PRESENT 0x1 #define PAGE_PRESENT 0x1
#define PAGE_WRITABLE 0x2 #define PAGE_WRITABLE 0x2
#define PAGE_USER 0x4 #define PAGE_USER 0x4
@@ -113,28 +115,24 @@ static void p_free_frame(void* addr) {
mark_free((uint32_t)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) { static void map_page(uint32_t vaddr, uint32_t paddr, uint32_t flags) {
uint32_t pde_entry = vaddr >> 22; uint32_t pde_entry = vaddr >> 22;
uint32_t pte_entry = (vaddr >> 12) & 0x3FF; 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 ((pd[pde_entry] & PAGE_PRESENT) == 0) {
if (page_directory[pde_entry] & PAGE_PRESENT == 0) { uint32_t new_table = (uint32_t)p_alloc_frame();
uint32_t* new_table = (uint32_t*)p_alloc_frame(); pd[pde_entry] = new_table | PAGE_PRESENT | PAGE_WRITABLE;
page_directory[pde_entry] = (uint32_t)new_table | flags; flush_tlb();
} for (int i = 0; i < 1024; i++) {
} tablev[i] = 0;
}
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);
} }
return (void*)vstart; tablev[pte_entry] = paddr | flags;
flush_tlb();
} }
void init_pmm(void* mmap_base, uint32_t mmap_limit) { void init_pmm(void* mmap_base, uint32_t mmap_limit) {
@@ -158,10 +156,32 @@ void init_page_tables() {
flush_tlb(); flush_tlb();
} }
void* init_kheap() {
}
uint32_t total_free_memory() { uint32_t total_free_memory() {
return total_available_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;
} }

View File

@@ -13,4 +13,6 @@ void* init_kheap();
uint32_t total_free_memory(); uint32_t total_free_memory();
void* create_user_pd();
#endif #endif