修复task释放时,内存泄漏的bug
This commit is contained in:
18
build_stm32f1.sh
Executable file
18
build_stm32f1.sh
Executable 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
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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("================");
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user