From c5f8599d906348185433511cf484643f65dfc30c Mon Sep 17 00:00:00 2001 From: 0x35c <> Date: Thu, 13 Nov 2025 12:09:36 +0100 Subject: [PATCH] wip: kernel and virt allocator --- headers/memory.h | 31 ++++++++++++++++--------------- src/memory/kern/page.c | 12 +++++++----- src/memory/memory.c | 4 ++-- src/memory/page_table.c | 8 +++----- src/memory/virt/page.c | 12 +++++------- src/multitasking/thread.c | 2 +- 6 files changed, 34 insertions(+), 35 deletions(-) diff --git a/headers/memory.h b/headers/memory.h index 6316a2e..f6e1d96 100644 --- a/headers/memory.h +++ b/headers/memory.h @@ -6,20 +6,21 @@ #include #include -#define PRESENT (1 << 0) -#define RW (1 << 1) -#define SUPERVISOR (0 << 2) -#define ACCESSED (1 << 4) -#define INIT_FLAGS (PRESENT | RW | SUPERVISOR) -#define PAGE_SIZE 4096 -#define PT_SIZE 1024 -#define PD_SIZE 1024 -#define PAGE_MASK 0xFFFFF000 -#define HEAP_END 0xC0000000 -#define HEAP_START ((uint32_t)&_kernel_end - HEAP_END) -#define KERNEL_START ((uint32_t)&_kernel_start) -#define KERNEL_END ((uint32_t)&_kernel_end - HEAP_END) -#define PT_START 256 +#define PRESENT (1 << 0) +#define RW (1 << 1) +#define SUPERVISOR (0 << 2) +#define ACCESSED (1 << 4) +#define INIT_FLAGS (PRESENT | RW | SUPERVISOR) +#define PAGE_SIZE 4096 +#define PT_SIZE 1024 +#define PD_SIZE 1024 +#define PAGE_MASK 0xFFFFF000 +#define HEAP_END 0xC0000000 +#define HEAP_START ((uint32_t)&_kernel_end - HEAP_END) +#define KERNEL_START ((uint32_t)&_kernel_start) +#define KERNEL_END ((uint32_t)&_kernel_end - HEAP_END) +#define KERNEL_PT_END 1020 +#define KERNEL_PT_START 769 #define GET_PAGE_ADDR(pd_index, pt_index) \ ((((uint32_t)pd_index * 1024) + (uint32_t)pt_index) * 4096) @@ -64,5 +65,5 @@ void *valloc_pages(size_t size, void **phys_addr); int kfree_pages(void *page_ptr, size_t size); int vfree_pages(void *page_ptr, size_t size); void init_page_table(uint32_t page_table[1024], uint16_t start); -int16_t add_page_table(uint16_t pd_index); +int16_t add_page_table(uint16_t pd_index, uint16_t pt_start); void switch_pd(uint32_t *pd, uint32_t *cr3); diff --git a/src/memory/kern/page.c b/src/memory/kern/page.c index 51cb559..63fdf7e 100644 --- a/src/memory/kern/page.c +++ b/src/memory/kern/page.c @@ -13,12 +13,14 @@ static int16_t find_next_block(size_t nb_pages, uint16_t *pd_index_ptr, uint32_t **page_table_ptr) { - for (*pd_index_ptr = 769; *pd_index_ptr < 1021; (*pd_index_ptr)++) { + for (*pd_index_ptr = KERNEL_PT_START; *pd_index_ptr < KERNEL_PT_END; + (*pd_index_ptr)++) { if (current_pd[(*pd_index_ptr)] == 0x02) { - if (add_page_table(*pd_index_ptr) < 0) + if (add_page_table(*pd_index_ptr, KERNEL_PT_START) < 0) return -2; } - *page_table_ptr = (uint32_t *)GET_PAGE_ADDR(769, *pd_index_ptr); + *page_table_ptr = + (uint32_t *)GET_PAGE_ADDR(KERNEL_PT_START, *pd_index_ptr); for (uint16_t i = 0; i + nb_pages - 1 < PT_SIZE; i++) { uint16_t j; for (j = 0; (*page_table_ptr)[i + j] >> 12 == i + j && @@ -67,7 +69,7 @@ int kfree_pages(void *page_ptr, size_t size) const uint32_t pd_index = page_index / PD_SIZE; const uint32_t pt_index = page_index % PD_SIZE; - if ((uint32_t)pd_index > 0x300) { + if ((uint32_t)pd_index < KERNEL_PT_START || pd_index > KERNEL_PT_END) { kprintf(KERN_WARNING "Address out of range\n"); return -1; } else if (page_addr % PAGE_SIZE) { @@ -78,7 +80,7 @@ int kfree_pages(void *page_ptr, size_t size) return -1; } uint32_t *page_table = - (uint32_t *)GET_PAGE_ADDR(0, PT_START + pd_index); + (uint32_t *)GET_PAGE_ADDR(KERNEL_PT_START, pd_index); for (uint16_t i = pt_index; i < pt_index + nb_pages; i++) { if (page_table[i] >> 12 == i) { kprintf(KERN_WARNING "Page already free\n"); diff --git a/src/memory/memory.c b/src/memory/memory.c index 6ae92d7..c9ac480 100644 --- a/src/memory/memory.c +++ b/src/memory/memory.c @@ -113,10 +113,10 @@ static void init_frame_zones(void) void init_memory(multiboot_info_t *mbd, uint32_t magic) { - for (uint16_t i = 769; i < 1021; i++) + for (uint16_t i = KERNEL_PT_START; i < 1020; i++) kernel_pd[i] = 0x02; init_page_table(page_table_default, 0); - kernel_pd[0] = ((uint32_t)page_table_default - HEAP_END) | 0x03; + kernel_pd[1020] = ((uint32_t)page_table_default - HEAP_END) | 0x03; current_pd = kernel_pd; init_multiboot(mbd, magic); init_frame_zones(); diff --git a/src/memory/page_table.c b/src/memory/page_table.c index 916830a..6e37292 100644 --- a/src/memory/page_table.c +++ b/src/memory/page_table.c @@ -6,15 +6,13 @@ void init_page_table(uint32_t page_table[1024], uint16_t start) page_table[i] = (i << 12) | 0x03; } -int16_t add_page_table(uint16_t pd_index) +int16_t add_page_table(uint16_t pd_index, uint16_t pt_start) { void *frame = alloc_frame(); if (!frame) return -1; - page_table_default[PT_START + pd_index] = - ((uint32_t)frame & PAGE_MASK) | 0x03; - uint32_t *page_table = - (uint32_t *)GET_PAGE_ADDR(0, PT_START + pd_index); + page_table_default[pd_index] = ((uint32_t)frame & PAGE_MASK) | 0x03; + uint32_t *page_table = (uint32_t *)GET_PAGE_ADDR(pt_start, pd_index); init_page_table(page_table, 0); kernel_pd[pd_index] = ((uint32_t)frame & PAGE_MASK) | 0x03; return 0; diff --git a/src/memory/virt/page.c b/src/memory/virt/page.c index 0c49f05..459b3dd 100644 --- a/src/memory/virt/page.c +++ b/src/memory/virt/page.c @@ -12,13 +12,12 @@ static int16_t find_next_block(size_t nb_pages, uint16_t *pd_index_ptr, uint32_t **page_table_ptr) { - for (*pd_index_ptr = 1; *pd_index_ptr < 768; (*pd_index_ptr)++) { + for (*pd_index_ptr = 2; *pd_index_ptr < 768; (*pd_index_ptr)++) { if (current_pd[(*pd_index_ptr)] == 0x02) { - if (add_page_table(*pd_index_ptr) < 0) + if (add_page_table(*pd_index_ptr, 1) < 0) return -2; } - *page_table_ptr = - (uint32_t *)GET_PAGE_ADDR(0, *pd_index_ptr + PT_START); + *page_table_ptr = (uint32_t *)GET_PAGE_ADDR(1, *pd_index_ptr); for (uint16_t i = 0; i + nb_pages - 1 < PT_SIZE; i++) { uint16_t j; for (j = 0; (*page_table_ptr)[i + j] >> 12 == i + j && @@ -77,11 +76,10 @@ int vfree_pages(void *page_ptr, size_t size) kprintf(KERN_WARNING "Invalid number of frames\n"); return -1; } - uint32_t *page_table = - (uint32_t *)GET_PAGE_ADDR(0, PT_START + pd_index); + uint32_t *page_table = (uint32_t *)GET_PAGE_ADDR(1, pd_index); for (uint16_t i = pt_index; i < pt_index + nb_pages; i++) { if (page_table[i] >> 12 == i) { - kprintf(KERN_WARNING "Page already free\n"); + kprintf(KERN_WARNING "Page already freed\n"); return -2; } free_frame((void *)(page_table[i] & PAGE_MASK)); diff --git a/src/multitasking/thread.c b/src/multitasking/thread.c index 978da94..8a1abe9 100644 --- a/src/multitasking/thread.c +++ b/src/multitasking/thread.c @@ -15,7 +15,7 @@ struct tcb *create_thread(struct pcb *process, void (*entry)(void)) return NULL; new_tcb->tid = process->tid++; - new_tcb->esp0 = kalloc_pages(STACK_SIZE, NULL); + new_tcb->esp0 = valloc_pages(STACK_SIZE, NULL); if (!new_tcb->esp0) { vfree(new_tcb); return NULL;