From 51dc254aa3c4f30868e97f9f35c9337c477a8f37 Mon Sep 17 00:00:00 2001 From: Ruslan Isaev Date: Tue, 9 Dec 2025 23:35:15 +0300 Subject: [PATCH] mm: improve stability by making the page bitmap full by default, also implement liballoc_lock and liballoc_unlock --- src/mm/kheap.c | 23 +++++++++-------------- src/mm/page_alloc.c | 2 +- src/mm/paging.c | 9 ++++++--- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/mm/kheap.c b/src/mm/kheap.c index 91337cb..4e25f6f 100644 --- a/src/mm/kheap.c +++ b/src/mm/kheap.c @@ -8,11 +8,13 @@ int liballoc_lock() { // Implement locking (disable interrupts or use spinlock) + asm volatile("cli"); return 0; } int liballoc_unlock() { // Implement unlocking + asm volatile("sti"); return 0; } @@ -81,19 +83,18 @@ void* kvalloc(size_t npages) { } // Temporarily store physical addresses - void* phys_addrs[npages]; uint32_t vaddr = KHEAP_START + start * PAGE_SIZE; - // Allocate physical pages first for (uint32_t i = 0; i < npages; i++) { - phys_addrs[i] = alloc_page(); - if (!phys_addrs[i]) { - // Cleanup on failure - for (uint32_t j = 0; j < i; j++) { - free_page(phys_addrs[j]); - } + void* phys = alloc_page(); + if (!phys) { + // Out of physical memory! Unmap what we just did and fail. + kvfree((void*)vaddr, i); return NULL; } + + // Map the page + map_page(phys, (void*)(vaddr + i * PAGE_SIZE), PAGE_PRESENT | PAGE_RW); } // Mark virtual pages as allocated @@ -101,12 +102,6 @@ void* kvalloc(size_t npages) { kheap_bitmap_set(i); } - // Map virtual to physical pages - for (uint32_t i = 0; i < npages; i++) { - map_page(phys_addrs[i], (void*)(vaddr + i * PAGE_SIZE), - PAGE_PRESENT | PAGE_RW); - } - return (void*)vaddr; } diff --git a/src/mm/page_alloc.c b/src/mm/page_alloc.c index b57e9b3..10fa28e 100644 --- a/src/mm/page_alloc.c +++ b/src/mm/page_alloc.c @@ -45,7 +45,7 @@ void clear_bit(uint32_t page_index) { void init_allocator() { int i; - memset(page_bitmap, 0x00, BITMAP_SIZE); + memset(page_bitmap, 0xFF, BITMAP_SIZE); } void* alloc_page() { diff --git a/src/mm/paging.c b/src/mm/paging.c index 91325b4..b0bc6dd 100644 --- a/src/mm/paging.c +++ b/src/mm/paging.c @@ -73,14 +73,14 @@ void grub_memory_map(unsigned int magic, struct multiboot_info* mbi) printf("Start Addr: %x | Length: %x | Size: %x | Type: %x\n", mmmt->addr_low, mmmt->len_low, mmmt->size, mmmt->type); - if(mmmt->type != MULTIBOOT_MEMORY_AVAILABLE) { + if(mmmt->type == MULTIBOOT_MEMORY_AVAILABLE) { /* * Do something with this memory block! * BE WARNED that some of memory shown as availiable is actually * actively being used by the kernel! You'll need to take that * into account before writing to memory! */ - printf("not available\n"); + printf("available\n"); uint32_t size_in_pages = mmmt->len_low / PAGE_SIZE; printf("size_in_pages: 0x%X\n", size_in_pages); @@ -88,7 +88,10 @@ void grub_memory_map(unsigned int magic, struct multiboot_info* mbi) uint32_t page_count = mmmt->len_low / PAGE_SIZE; printf("page_base: %X, page_count: %X\n", base_page, page_count); for (uint32_t j = 0; j < page_count; j++) { - set_bit(base_page + j); + // Only clear the bit if it fits in our bitmap + if ((base_page + j) < (BITMAP_SIZE * 8)) { + clear_bit(base_page + j); + } } } }