From edc62ea818ba32f0598b3f6b8448aaf370a2b041 Mon Sep 17 00:00:00 2001 From: fslongjin Date: Tue, 10 May 2022 23:51:59 +0800 Subject: [PATCH] =?UTF-8?q?:wrench:=20=E5=B0=86malloc=E9=93=BE=E8=A1=A8?= =?UTF-8?q?=E7=BB=93=E7=82=B9=E5=85=83=E7=B4=A0=E8=B0=83=E6=95=B4=E4=B8=BA?= =?UTF-8?q?2=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- user/libs/libc/malloc.c | 53 ++++++++--------------------------------- 1 file changed, 10 insertions(+), 43 deletions(-) diff --git a/user/libs/libc/malloc.c b/user/libs/libc/malloc.c index 1139a54d..78cf81e6 100644 --- a/user/libs/libc/malloc.c +++ b/user/libs/libc/malloc.c @@ -11,7 +11,6 @@ */ typedef struct malloc_mem_chunk_t { - uint64_t start_addr; // 整个块所在内存区域的起始地址(包括header) uint64_t length; // 整个块所占用的内存区域的大小 struct malloc_mem_chunk_t *prev; // 上一个结点的指针 struct malloc_mem_chunk_t *next; // 下一个结点的指针 @@ -24,9 +23,7 @@ static uint64_t brk_managed_addr = 0; // 堆区域已经被管理的地址 // 空闲链表 // 按start_addr升序排序 static malloc_mem_chunk_t *malloc_free_list = NULL; -// 已分配链表 -// 使用LIFO策略。基于假设:程序运行早期分配的内存会被最晚释放 -static malloc_mem_chunk_t *malloc_allocated_list = NULL; + /** * @brief 获取一块堆内存(不尝试扩大堆内存) @@ -142,9 +139,8 @@ static int malloc_enlarge(int32_t size) // 扩展管理的堆空间 // 在新分配的内存的底部放置header malloc_mem_chunk_t *new_ck = (malloc_mem_chunk_t *)brk_managed_addr; - new_ck->start_addr = (uint64_t)new_ck; new_ck->length = brk_max_addr - brk_managed_addr; - printf("new_ck->start_addr=%#018lx\tbrk_max_addr=%#018lx\tbrk_managed_addr=%#018lx\n", new_ck->start_addr, brk_max_addr, brk_managed_addr); + printf("new_ck->start_addr=%#018lx\tbrk_max_addr=%#018lx\tbrk_managed_addr=%#018lx\n", (uint64_t)new_ck, brk_max_addr, brk_managed_addr); new_ck->prev = new_ck->next = NULL; brk_managed_addr = brk_max_addr; @@ -165,7 +161,7 @@ static void malloc_merge_free_chunk() while (ptr) { // 内存块连续 - if (ptr->prev->start_addr + ptr->prev->length == ptr->start_addr) + if (((uint64_t)(ptr->prev) + ptr->prev->length == (uint64_t)ptr)) { // 将ptr与前面的空闲块合并 ptr->prev->length += ptr->length; @@ -192,11 +188,11 @@ static void malloc_insert_free_list(malloc_mem_chunk_t *ck) } else { - uint64_t ck_end = ck->start_addr + ck->length; + uint64_t ck_end = (uint64_t)ck + ck->length; malloc_mem_chunk_t *ptr = malloc_free_list; while (ptr) { - if (ptr->start_addr < ck->start_addr) + if ((uint64_t)ptr < (uint64_t)ck) { if (ptr->next == NULL) // 当前是最后一个项 { @@ -205,7 +201,7 @@ static void malloc_insert_free_list(malloc_mem_chunk_t *ck) ck->prev = ptr; break; } - else if (ptr->next->start_addr > ck->start_addr) + else if ((uint64_t)(ptr->next) > (uint64_t)ck) { ck->prev = ptr; ck->next = ptr->next; @@ -286,28 +282,14 @@ found:; printf("new_ck = %#018lx\n", ((uint64_t)ck) + size); malloc_mem_chunk_t *new_ck = ((uint64_t)ck) + size; new_ck->length = ck->length - size; - new_ck->start_addr = (uint64_t)new_ck; new_ck->prev = new_ck->next = NULL; ck->length = size; malloc_insert_free_list(new_ck); } printf("12121212\n"); - // 插入到已分配链表 - // 直接插入到链表头,符合LIFO - ck->prev = NULL; - if (malloc_allocated_list) // 已分配链表不为空 - { - malloc_allocated_list->prev = ck; - ck->next = malloc_allocated_list; - malloc_allocated_list = ck; - } - else // 已分配链表为空 - { - malloc_allocated_list = ck; - ck->next = NULL; - } - return (void *)(ck->start_addr + sizeof(malloc_mem_chunk_t)); + + return (void *)((uint64_t)ck+ sizeof(malloc_mem_chunk_t)); } /** * @brief 获取一块堆内存 @@ -364,30 +346,15 @@ found:; { malloc_mem_chunk_t *new_ck = ((uint64_t)ck) + size; new_ck->length = ck->length - size; - new_ck->start_addr = (uint64_t)new_ck; new_ck->prev = new_ck->next = NULL; printf("new_ck=%#018lx, new_ck->length=%#010lx\n", (uint64_t)new_ck, new_ck->length); ck->length = size; malloc_insert_free_list(new_ck); } - // 插入到已分配链表 - // 直接插入到链表头,符合LIFO - ck->prev = NULL; - if (malloc_allocated_list) // 已分配链表不为空 - { - malloc_allocated_list->prev = ck; - ck->next = malloc_allocated_list; - malloc_allocated_list = ck; - } - else // 已分配链表为空 - { - malloc_allocated_list = ck; - ck->next = NULL; - } + printf("ck=%lld\n", (uint64_t)ck); - printf("ck->start_addr=%lld\n", ck->start_addr); - return (void *)(ck->start_addr + sizeof(malloc_mem_chunk_t)); + return (void *)((uint64_t)ck + sizeof(malloc_mem_chunk_t)); } /**