完善ipc对象&完善nsfs&完善文件接口

This commit is contained in:
zhangzheng
2025-03-02 23:31:22 +08:00
parent d8a8b2e3f7
commit 6049dad2b1
66 changed files with 713 additions and 345 deletions

View File

@@ -21,6 +21,7 @@
#include "init.h"
#include "dlist.h"
#include "printk.h"
#include "ref.h"
#if IS_ENABLED(CONFIG_BUDDY_SLAB)
#include <slab.h>
static slab_t *share_mem_slab;
@@ -60,6 +61,7 @@ typedef struct share_mem
dlist_head_t task_head; //!< 哪些任务使用了该共享内存
share_mem_type_t mem_type; //!< 内存类型
ram_limit_t *lim; //!< 内存限额
ref_counter_t ref; //!< 引用计数
} share_mem_t;
enum share_mem_op
@@ -67,24 +69,26 @@ enum share_mem_op
SHARE_MEM_MAP,
SHARE_MEM_UNMAP,
};
#if IS_ENABLED(CONFIG_BUDDY_SLAB)
/**
* 初始化共享内存对象的内存分配器
*/
static void share_mem_slab_init(void)
{
#if IS_ENABLED(CONFIG_BUDDY_SLAB)
share_mem_slab = slab_create(sizeof(share_mem_t), "share_mem");
assert(share_mem_slab);
share_mem_task_node_slab = slab_create(sizeof(share_mem_task_node_t), "share_mem_task_node");
sizeof(share_mem_task_node_slab);
#endif
}
INIT_KOBJ_MEM(share_mem_slab_init);
#endif
/**
* @brief 共享内存解除映射
*
* @param sm
* @return int
*/
static void *share_mem_unmap_task(share_mem_t *sm)
static void *share_mem_unmap_task(share_mem_t *sm, task_t *tk)
{
vaddr_t vaddr = 0;
share_mem_task_node_t *pos;
@@ -94,7 +98,6 @@ static void *share_mem_unmap_task(share_mem_t *sm)
{
return NULL;
}
task_t *tk = thread_get_current_task();
dlist_foreach(&sm->task_head, pos, share_mem_task_node_t, node)
{
if (pos->task == tk)
@@ -382,6 +385,19 @@ static int share_mem_unmap(share_mem_t *obj, vaddr_t vaddr)
task_vma_free_pmem(&task->mm_space.mem_vma, vaddr, obj->size, FALSE);
return 0;
}
static void share_mem_unmap_op(task_t *tk, share_mem_t *sm)
{
vaddr_t addr;
// 从记录中删除
addr = (vaddr_t)share_mem_unmap_task(sm, tk);
if (addr)
{
share_mem_unmap(sm, addr);
ref_counter_dec_and_release(&tk->ref_cn, &tk->kobj);
ref_counter_dec_and_release(&sm->ref, &sm->kobj);
}
}
static void share_mem_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f)
{
ssize_t ret;
@@ -419,6 +435,7 @@ static void share_mem_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i
ret = -EAGAIN;
goto end;
}
ref_counter_inc(&sm->ref);
f->regs[1] = (umword_t)ret_vaddr;
f->regs[2] = sm->size;
end:
@@ -427,15 +444,7 @@ static void share_mem_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i
break;
case SHARE_MEM_UNMAP:
{
vaddr_t addr;
// 从记录中删除
addr = (vaddr_t)share_mem_unmap_task(sm);
if (addr)
{
share_mem_unmap(sm, addr);
ref_counter_dec_and_release(&task->ref_cn, &task->kobj);
}
share_mem_unmap_op(task, sm);
tag = msg_tag_init4(0, 0, 0, 0);
}
break;
@@ -447,15 +456,8 @@ static void share_mem_obj_unmap(obj_space_t *obj_space, kobject_t *kobj)
{
task_t *task = container_of(obj_space, task_t, obj_space);
share_mem_t *sm = container_of(kobj, share_mem_t, kobj);
vaddr_t addr;
// 从记录中删除
addr = (vaddr_t)share_mem_unmap_task(sm);
if (addr)
{
share_mem_unmap(sm, addr);
ref_counter_dec_and_release(&task->ref_cn, &task->kobj);
}
share_mem_unmap_op(task, sm);
}
static void share_mem_release_stage1(kobject_t *kobj)
{
@@ -466,7 +468,7 @@ static void share_mem_release_stage2(kobject_t *kobj)
{
share_mem_t *sm = container_of(kobj, share_mem_t, kobj);
assert(dlist_is_empty(&sm->task_head)); // TODO:有bug
assert(dlist_is_empty(&sm->task_head)); // TODO:有bug,释放这个对象的时候这个链表可能不为空,应该给对象增加引用计数
#if IS_ENABLED(CONFIG_MMU)
share_mem_free_pmem(sm);
@@ -477,6 +479,12 @@ static void share_mem_release_stage2(kobject_t *kobj)
#endif
printk("share mem 0x%x free.\n", sm);
}
bool_t share_mem_put(kobject_t *kobj)
{
share_mem_t *sm = container_of(kobj, share_mem_t, kobj);
return ref_counter_dec(&sm->ref) == 1;
}
/**
* @brief share_mem init.
*
@@ -486,11 +494,14 @@ static void share_mem_release_stage2(kobject_t *kobj)
static void share_mem_init(share_mem_t *sm, umword_t max)
{
kobject_init(&sm->kobj, SHARE_MEM_TYPE);
ref_counter_init(&sm->ref);
ref_counter_inc(&sm->ref);
sm->size = max;
sm->kobj.invoke_func = share_mem_syscall;
sm->kobj.unmap_func = share_mem_obj_unmap;
sm->kobj.stage_1_func = share_mem_release_stage1;
sm->kobj.stage_2_func = share_mem_release_stage2;
sm->kobj.put_func = share_mem_put;
}
/**
* @brief 创建共享内存对象