修复task释放时,内存泄漏的bug

This commit is contained in:
zhangzheng
2023-09-29 13:23:12 +08:00
parent 224ca9f33c
commit 322634889b
9 changed files with 53 additions and 11 deletions

18
build_stm32f1.sh Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/bash
# export TOOLCHAIN=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/
# export TOOLCHAIN_LIB=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/lib/gcc/arm-none-eabi/5.4.1/armv7-m
export TOOLCHAIN=/opt/homebrew/bin/
export TOOLCHAIN_LIB=/opt/homebrew/lib/gcc/arm-none-eabi/13.2.0/thumb
export KNL=mkrtos
export KEN_OFFSET=0x2000
export INIT_OFFSET=0x10000
export BOOTFS_ADDR_OFFSET=0x20000
export KNL_TEXT=0x8000000
export KNL_DATA=0x20000000
export KNL_DATA_SIZE=64K
export BOARD=STM32F1x
set -e
cmake -G Ninja -B build/$KNL .
cd build/$KNL && ninja

View File

@@ -62,8 +62,10 @@ typedef struct obj_space
{
obj_map_tab_t tab;
} obj_space_t;
void obj_space_init(obj_space_t *obj_space, ram_limit_t *ram);
void obj_space_release(obj_space_t *obj_space, ram_limit_t *ram);
void obj_space_del(obj_space_t *obj_space, obj_addr_t inx);
obj_map_entry_t *obj_space_insert(obj_space_t *obj_space, ram_limit_t *ram, kobject_t *kobj, obj_addr_t inx, uint8_t attrs);
obj_map_entry_t *obj_space_lookup(obj_space_t *obj_space, obj_addr_t inx);
kobject_t *obj_space_lookup_kobj(obj_space_t *obj_space, obj_addr_t inx);
kobject_t *obj_space_lookup_kobj(obj_space_t *obj_space, obj_addr_t inx);

View File

@@ -465,7 +465,7 @@ static void ipc_release_stage2(kobject_t *kobj)
ipc_t *ipc = container_of(kobj, ipc_t, kobj);
mm_limit_free(ipc->lim, kobj);
printk("ipc 0x%x\n", kobj);
printk("ipc release 0x%x\n", kobj);
}
static void ipc_init(ipc_t *ipc, ram_limit_t *lim)
{

View File

@@ -110,7 +110,7 @@ void irq_sender_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag,
f->r[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw;
return;
}
ref_counter_inc(&irq->wait_thread->ref); //! 引用计数+1
switch (sys_p.op)
{
case BIND_IRQ:
@@ -139,7 +139,9 @@ void irq_sender_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag,
break;
case WAIT_IRQ:
{
ref_counter_inc(&th->ref);
int ret = irq_sender_wait(irq, th);
ref_counter_dec_and_release(&th->ref, &irq->kobj); //! 引用计数+1
tag = msg_tag_init4(0, 0, 0, ret);
}
break;
@@ -152,7 +154,6 @@ void irq_sender_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag,
default:
break;
}
ref_counter_dec_and_release(&irq->wait_thread->ref, &irq->kobj); //! 引用计数+1
f->r[0] = tag.raw;
}

View File

@@ -1,12 +1,12 @@
/**
* @file mm.c
* @author zhangzheng (1358745329@qq.com)
* @brief
* @brief
* @version 0.1
* @date 2023-09-29
*
*
* @copyright Copyright (c) 2023
*
*
*/
#include "mm.h"
@@ -351,6 +351,7 @@ void mem_trace(mem_t *_this)
{
struct mem_heap *mem;
printk("================");
printk("start heap:0x%x.\n", _this->heap_start);
printk("l heap:0x%x.\n", _this->l_heap);
printk("end heap:0x%x.\n", _this->heap_end);
@@ -359,4 +360,5 @@ void mem_trace(mem_t *_this)
{
printk("%d [0x%x-] %dB\n", mem->used, mem, mem->size);
}
printk("================");
}

View File

@@ -33,7 +33,11 @@ void *mm_limit_alloc(ram_limit_t *limit, size_t size)
}
void mm_limit_free(ram_limit_t *limit, void *mem)
{
size_t size = *((size_t *)(char *)mem - sizeof(size_t));
if (!mem)
{
return;
}
size_t size = *((size_t *)((char *)mem - sizeof(size_t)));
mem_free(mm_get_global(), (char *)mem - sizeof(size_t));
ram_limit_free(limit, size);
@@ -65,6 +69,10 @@ void *mm_limit_alloc_align(ram_limit_t *limit, size_t size, size_t align)
}
void mm_limit_free_align(ram_limit_t *limit, void *mem, size_t size)
{
if (!mem)
{
return;
}
mem_free_align(mm_get_global(), (char *)mem);
ram_limit_free(limit, size);
}

View File

@@ -1,15 +1,16 @@
/**
* @file obj_space.c
* @author zhangzheng (1358745329@qq.com)
* @brief
* @brief
* @version 0.1
* @date 2023-09-29
*
*
* @copyright Copyright (c) 2023
*
*
*/
#include "obj_space.h"
#include "types.h"
#include "mm_wrap.h"
void obj_space_init(obj_space_t *obj_space, ram_limit_t *ram)
{
@@ -18,6 +19,13 @@ void obj_space_init(obj_space_t *obj_space, ram_limit_t *ram)
obj_space->tab.tabs[i] = NULL;
}
}
void obj_space_release(obj_space_t *obj_space, ram_limit_t *ram)
{
for (int i = 0; i < OBJ_MAP_TAB_SIZE; i++)
{
mm_limit_free(ram, obj_space->tab.tabs[i]);
}
}
void obj_space_del(obj_space_t *obj_space, obj_addr_t inx)
{
assert(obj_space);

View File

@@ -165,12 +165,14 @@ static void task_release_stage2(kobject_t *kobj)
kobj_del_list_t kobj_list;
task_t *cur_tk = thread_get_current_task();
obj_space_release(&tk->obj_space, tk->lim);
mm_limit_free_align(tk->lim, tk->mm_space.mm_block, tk->mm_space.mm_block_size);
mm_limit_free(tk->lim, tk);
// if (cur_tk == tk)
{
thread_sched();
}
// mm_trace();
printk("release tk %x\n", tk);
}
void task_kill(task_t *tk)

View File

@@ -49,6 +49,7 @@ INIT_STAGE1(knl_init_1);
*/
static void knl_init_2(void)
{
mm_trace();
thread_t *init_thread = thread_create(&root_factory_get()->limit);
assert(init_thread);
task_t *init_task = task_create(&root_factory_get()->limit, FALSE);