mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-09 07:06:47 +00:00
完成了malloc和free
This commit is contained in:
parent
8b8583cad9
commit
c120a0e992
@ -361,12 +361,12 @@ uint64_t sys_brk(struct pt_regs *regs)
|
|||||||
|
|
||||||
if ((int64_t)regs->r8 == -1)
|
if ((int64_t)regs->r8 == -1)
|
||||||
{
|
{
|
||||||
kdebug("get brk_start=%#018lx", current_pcb->mm->brk_start);
|
// kdebug("get brk_start=%#018lx", current_pcb->mm->brk_start);
|
||||||
return current_pcb->mm->brk_start;
|
return current_pcb->mm->brk_start;
|
||||||
}
|
}
|
||||||
if ((int64_t)regs->r8 == -2)
|
if ((int64_t)regs->r8 == -2)
|
||||||
{
|
{
|
||||||
kdebug("get brk_end=%#018lx", current_pcb->mm->brk_end);
|
// kdebug("get brk_end=%#018lx", current_pcb->mm->brk_end);
|
||||||
return current_pcb->mm->brk_end;
|
return current_pcb->mm->brk_end;
|
||||||
}
|
}
|
||||||
if (new_brk > current_pcb->addr_limit) // 堆地址空间超过限制
|
if (new_brk > current_pcb->addr_limit) // 堆地址空间超过限制
|
||||||
@ -409,8 +409,6 @@ void do_syscall_int(struct pt_regs *regs, unsigned long error_code)
|
|||||||
{
|
{
|
||||||
|
|
||||||
ul ret = system_call_table[regs->rax](regs);
|
ul ret = system_call_table[regs->rax](regs);
|
||||||
if(regs->rax == SYS_BRK)
|
|
||||||
kdebug("brk ret=%#018lx", ret);
|
|
||||||
regs->rax = ret; // 返回码
|
regs->rax = ret; // 返回码
|
||||||
}
|
}
|
||||||
|
|
||||||
|
28
user/init.c
28
user/init.c
@ -32,9 +32,31 @@ int main()
|
|||||||
put_string(buf, COLOR_YELLOW, COLOR_BLACK);
|
put_string(buf, COLOR_YELLOW, COLOR_BLACK);
|
||||||
close(fd);
|
close(fd);
|
||||||
*/
|
*/
|
||||||
char *p = malloc(100);
|
|
||||||
*p = 'a';
|
void *ptr[256] = {0};
|
||||||
printf("p=%lld\t*p=%c\n", (uint64_t)p, *p);
|
for (int k = 0; k < 2; ++k)
|
||||||
|
{
|
||||||
|
printf("try to malloc 256*16K=4MB\n");
|
||||||
|
uint64_t js = 0;
|
||||||
|
for (int i = 0; i < 256; ++i)
|
||||||
|
{
|
||||||
|
ptr[i] = malloc(4096 * 4);
|
||||||
|
js += *(uint64_t *)((uint64_t)(ptr[i]) - sizeof(uint64_t));
|
||||||
|
if (*(uint64_t *)((uint64_t)(ptr[i]) - sizeof(uint64_t)) > 0x4008)
|
||||||
|
printf("[%d] start_addr = %#018lx, len = %#010lx\n", (uint64_t)(ptr[i]) - 8, *(uint64_t *)((uint64_t)(ptr[i]) - sizeof(uint64_t)));
|
||||||
|
}
|
||||||
|
printf("ptr[0]->len=%lld\n", *(uint64_t *)((uint64_t)ptr[0] - sizeof(uint64_t)));
|
||||||
|
printf("ptr[1]->len=%lld\n", *(uint64_t *)((uint64_t)ptr[1] - sizeof(uint64_t)));
|
||||||
|
// printf("ptr[24]->len=%lld\n", *(uint64_t*)((uint64_t)ptr[24] - sizeof(uint64_t)));
|
||||||
|
printf("alloc done. total used: %lld bytes\n", js);
|
||||||
|
printf("try to free...\n");
|
||||||
|
for (int i = 0; i < 256; ++i)
|
||||||
|
{
|
||||||
|
free(ptr[i]);
|
||||||
|
}
|
||||||
|
printf("free done!\n");
|
||||||
|
}
|
||||||
|
|
||||||
// *p = 'a';
|
// *p = 'a';
|
||||||
/*
|
/*
|
||||||
pid_t p = fork();
|
pid_t p = fork();
|
||||||
|
@ -57,10 +57,10 @@ static malloc_mem_chunk_t *malloc_query_free_chunk_bf(uint64_t size)
|
|||||||
}
|
}
|
||||||
malloc_mem_chunk_t *ptr = malloc_free_list;
|
malloc_mem_chunk_t *ptr = malloc_free_list;
|
||||||
malloc_mem_chunk_t *best = NULL;
|
malloc_mem_chunk_t *best = NULL;
|
||||||
printf("query size=%d", size);
|
// printf("query size=%d", size);
|
||||||
while (ptr != NULL)
|
while (ptr != NULL)
|
||||||
{
|
{
|
||||||
printf("ptr->length=%#010lx\n", ptr->length);
|
// printf("ptr->length=%#010lx\n", ptr->length);
|
||||||
if (ptr->length == size)
|
if (ptr->length == size)
|
||||||
{
|
{
|
||||||
best = ptr;
|
best = ptr;
|
||||||
@ -69,18 +69,14 @@ static malloc_mem_chunk_t *malloc_query_free_chunk_bf(uint64_t size)
|
|||||||
|
|
||||||
if (ptr->length > size)
|
if (ptr->length > size)
|
||||||
{
|
{
|
||||||
printf("676767\n");
|
|
||||||
if (best == NULL)
|
if (best == NULL)
|
||||||
best = ptr;
|
best = ptr;
|
||||||
else if (best->length > ptr->length)
|
else if (best->length > ptr->length)
|
||||||
best = ptr;
|
best = ptr;
|
||||||
printf("6rdf\n");
|
|
||||||
}
|
}
|
||||||
printf("ptr->next=%#018lx\n", ptr->next);
|
|
||||||
ptr = ptr->next;
|
ptr = ptr->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("return best=%#018lx\n", (uint64_t)best);
|
|
||||||
return best;
|
return best;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -275,7 +271,7 @@ void *malloc(ssize_t size)
|
|||||||
}
|
}
|
||||||
found:;
|
found:;
|
||||||
|
|
||||||
printf("ck = %#018lx\n", (uint64_t)ck);
|
// printf("ck = %#018lx\n", (uint64_t)ck);
|
||||||
if (ck == NULL)
|
if (ck == NULL)
|
||||||
return (void *)-ENOMEM;
|
return (void *)-ENOMEM;
|
||||||
// 分配空闲块
|
// 分配空闲块
|
||||||
@ -296,12 +292,12 @@ found:;
|
|||||||
malloc_mem_chunk_t *new_ck = (malloc_mem_chunk_t *)(((uint64_t)ck) + size);
|
malloc_mem_chunk_t *new_ck = (malloc_mem_chunk_t *)(((uint64_t)ck) + size);
|
||||||
new_ck->length = ck->length - size;
|
new_ck->length = ck->length - size;
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("ck=%lld\n", (uint64_t)ck);
|
// printf("ck=%lld\n", (uint64_t)ck);
|
||||||
// 此时链表结点的指针的空间被分配出去
|
// 此时链表结点的指针的空间被分配出去
|
||||||
return (void *)((uint64_t)ck + sizeof(uint64_t));
|
return (void *)((uint64_t)ck + sizeof(uint64_t));
|
||||||
}
|
}
|
||||||
@ -313,4 +309,8 @@ found:;
|
|||||||
*/
|
*/
|
||||||
void free(void *ptr)
|
void free(void *ptr)
|
||||||
{
|
{
|
||||||
|
// 找到结点(此时prev和next都处于未初始化的状态)
|
||||||
|
malloc_mem_chunk_t * ck = (malloc_mem_chunk_t *)((uint64_t)ptr-sizeof(uint64_t));
|
||||||
|
// printf("free(): addr = %#018lx\t len=%#018lx\n", (uint64_t)ck, ck->length);
|
||||||
|
malloc_insert_free_list(ck);
|
||||||
}
|
}
|
||||||
|
@ -85,7 +85,7 @@ pid_t vfork(void)
|
|||||||
uint64_t brk(uint64_t end_brk)
|
uint64_t brk(uint64_t end_brk)
|
||||||
{
|
{
|
||||||
uint64_t x = (uint64_t)syscall_invoke(SYS_BRK, (uint64_t)end_brk, 0, 0, 0, 0, 0, 0, 0);
|
uint64_t x = (uint64_t)syscall_invoke(SYS_BRK, (uint64_t)end_brk, 0, 0, 0, 0, 0, 0, 0);
|
||||||
printf("brk(): end_brk=%#018lx x=%#018lx", (uint64_t)end_brk, x);
|
// printf("brk(): end_brk=%#018lx x=%#018lx", (uint64_t)end_brk, x);
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user