🔧 将malloc链表结点元素调整为2个

This commit is contained in:
fslongjin 2022-05-10 23:51:59 +08:00
parent c43d65b2c9
commit edc62ea818

View File

@ -11,7 +11,6 @@
*/ */
typedef struct malloc_mem_chunk_t typedef struct malloc_mem_chunk_t
{ {
uint64_t start_addr; // 整个块所在内存区域的起始地址包括header
uint64_t length; // 整个块所占用的内存区域的大小 uint64_t length; // 整个块所占用的内存区域的大小
struct malloc_mem_chunk_t *prev; // 上一个结点的指针 struct malloc_mem_chunk_t *prev; // 上一个结点的指针
struct malloc_mem_chunk_t *next; // 下一个结点的指针 struct malloc_mem_chunk_t *next; // 下一个结点的指针
@ -24,9 +23,7 @@ static uint64_t brk_managed_addr = 0; // 堆区域已经被管理的地址
// 空闲链表 // 空闲链表
// 按start_addr升序排序 // 按start_addr升序排序
static malloc_mem_chunk_t *malloc_free_list = NULL; static malloc_mem_chunk_t *malloc_free_list = NULL;
// 已分配链表
// 使用LIFO策略。基于假设程序运行早期分配的内存会被最晚释放
static malloc_mem_chunk_t *malloc_allocated_list = NULL;
/** /**
* @brief * @brief
@ -142,9 +139,8 @@ static int malloc_enlarge(int32_t size)
// 扩展管理的堆空间 // 扩展管理的堆空间
// 在新分配的内存的底部放置header // 在新分配的内存的底部放置header
malloc_mem_chunk_t *new_ck = (malloc_mem_chunk_t *)brk_managed_addr; 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; 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; new_ck->prev = new_ck->next = NULL;
brk_managed_addr = brk_max_addr; brk_managed_addr = brk_max_addr;
@ -165,7 +161,7 @@ static void malloc_merge_free_chunk()
while (ptr) 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与前面的空闲块合并
ptr->prev->length += ptr->length; ptr->prev->length += ptr->length;
@ -192,11 +188,11 @@ static void malloc_insert_free_list(malloc_mem_chunk_t *ck)
} }
else 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; malloc_mem_chunk_t *ptr = malloc_free_list;
while (ptr) while (ptr)
{ {
if (ptr->start_addr < ck->start_addr) if ((uint64_t)ptr < (uint64_t)ck)
{ {
if (ptr->next == NULL) // 当前是最后一个项 if (ptr->next == NULL) // 当前是最后一个项
{ {
@ -205,7 +201,7 @@ static void malloc_insert_free_list(malloc_mem_chunk_t *ck)
ck->prev = ptr; ck->prev = ptr;
break; break;
} }
else if (ptr->next->start_addr > ck->start_addr) else if ((uint64_t)(ptr->next) > (uint64_t)ck)
{ {
ck->prev = ptr; ck->prev = ptr;
ck->next = ptr->next; ck->next = ptr->next;
@ -286,28 +282,14 @@ found:;
printf("new_ck = %#018lx\n", ((uint64_t)ck) + size); printf("new_ck = %#018lx\n", ((uint64_t)ck) + size);
malloc_mem_chunk_t *new_ck = ((uint64_t)ck) + size; malloc_mem_chunk_t *new_ck = ((uint64_t)ck) + size;
new_ck->length = ck->length - size; new_ck->length = ck->length - size;
new_ck->start_addr = (uint64_t)new_ck;
new_ck->prev = new_ck->next = NULL; new_ck->prev = new_ck->next = NULL;
ck->length = size; ck->length = size;
malloc_insert_free_list(new_ck); malloc_insert_free_list(new_ck);
} }
printf("12121212\n"); printf("12121212\n");
// 插入到已分配链表
// 直接插入到链表头符合LIFO return (void *)((uint64_t)ck+ sizeof(malloc_mem_chunk_t));
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));
} }
/** /**
* @brief * @brief
@ -364,30 +346,15 @@ found:;
{ {
malloc_mem_chunk_t *new_ck = ((uint64_t)ck) + size; malloc_mem_chunk_t *new_ck = ((uint64_t)ck) + size;
new_ck->length = ck->length - size; new_ck->length = ck->length - size;
new_ck->start_addr = (uint64_t)new_ck;
new_ck->prev = new_ck->next = NULL; new_ck->prev = new_ck->next = NULL;
printf("new_ck=%#018lx, new_ck->length=%#010lx\n", (uint64_t)new_ck, new_ck->length); printf("new_ck=%#018lx, new_ck->length=%#010lx\n", (uint64_t)new_ck, new_ck->length);
ck->length = size; ck->length = size;
malloc_insert_free_list(new_ck); 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=%lld\n", (uint64_t)ck);
printf("ck->start_addr=%lld\n", ck->start_addr); return (void *)((uint64_t)ck + sizeof(malloc_mem_chunk_t));
return (void *)(ck->start_addr + sizeof(malloc_mem_chunk_t));
} }
/** /**