mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 18:26:48 +00:00
🔧 将malloc链表结点元素调整为2个
This commit is contained in:
parent
c43d65b2c9
commit
edc62ea818
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user