From c0207c5e49e5211cc0ffbd353912162812cf3d10 Mon Sep 17 00:00:00 2001 From: Shehapp <88383557+Shehapp@users.noreply.github.com> Date: Thu, 21 Dec 2023 21:36:53 +0200 Subject: [PATCH] get metadata of k_page in o(1) --- inc/memlayout.h | 2 ++ kern/mem/kheap.c | 22 ++++++---------------- kern/mem/memory_manager.c | 1 + 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/inc/memlayout.h b/inc/memlayout.h index 35e05d5..1407fdb 100644 --- a/inc/memlayout.h +++ b/inc/memlayout.h @@ -214,6 +214,8 @@ struct FrameInfo { struct Env *environment; unsigned char isBuffered; struct WorkingSetElement *element; + //2023 + struct K_heap_sh *page_meta_data; }; #endif /* !__ASSEMBLER__ */ diff --git a/kern/mem/kheap.c b/kern/mem/kheap.c index b31bea4..e290324 100644 --- a/kern/mem/kheap.c +++ b/kern/mem/kheap.c @@ -299,8 +299,8 @@ void* kmalloc(unsigned int size) { for ( uint32 g=needed_pages; g > 0; i = i + PAGE_SIZE, g--) { struct FrameInfo *pll = NULL; - allocate_frame(&pll); + pll->page_meta_data=page; pll->va=i; map_frame(ptr_page_directory, pll, (int) i, PERM_WRITEABLE | PERM_PRESENT); @@ -370,15 +370,7 @@ void kfree(void* virtual_address) if(virtual_address>= kernel_limit&& virtual_address<=(void*)KERNEL_HEAP_MAX){ - struct K_heap_sh *cur_free; - LIST_FOREACH(cur_free, &hlist){ - - //serach for exact virtual address - if((void*)cur_free->vir_addf==virtual_address) - break; - } - - + struct K_heap_sh *cur_free=get_K_heap_sh(virtual_address); struct K_heap_sh *cur_free_prev=NULL; @@ -791,10 +783,8 @@ uint8 realloc_in_myPlace(void *virtual_address, unsigned int new_size){ } void *get_K_heap_sh(void *virtual_address){ - struct K_heap_sh *cur; - LIST_FOREACH(cur, &hlist){ - if((void*)cur->vir_addf==virtual_address) - break; - } - return cur; + uint32 *ptr_page_table; + struct FrameInfo* ptr_frame_info = get_frame_info(ptr_page_directory,(uint32)virtual_address, &ptr_page_table); + if( ptr_frame_info == 0 )return NULL; + return ptr_frame_info->page_meta_data; } diff --git a/kern/mem/memory_manager.c b/kern/mem/memory_manager.c index 4b6017f..5aae473 100644 --- a/kern/mem/memory_manager.c +++ b/kern/mem/memory_manager.c @@ -503,6 +503,7 @@ void unmap_frame(uint32 *ptr_page_directory, uint32 virtual_address) struct FrameInfo* ptr_frame_info = get_frame_info(ptr_page_directory, virtual_address, &ptr_page_table); if( ptr_frame_info != 0 ) { + ptr_frame_info->page_meta_data=NULL; if (ptr_frame_info->isBuffered && !CHECK_IF_KERNEL_ADDRESS((uint32)virtual_address)) cprintf("WARNING: Freeing BUFFERED frame at va %x!!!\n", virtual_address) ; decrement_references(ptr_frame_info);