From 347a1372bc952a03890a0bf93cbb7b359db2b6bd Mon Sep 17 00:00:00 2001 From: zhangzheng <1358745329@qq.com> Date: Tue, 18 Mar 2025 21:18:26 +0800 Subject: [PATCH] =?UTF-8?q?posix=20shm=20&=20system=20v=E7=9A=84=E4=BF=A1?= =?UTF-8?q?=E5=8F=B7=E9=87=8F=E6=94=AF=E6=8C=81=EF=BC=88=E6=9C=AA=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 7 +- TODO.md | 3 +- mkrtos_knl/knl/access.c | 3 - mkrtos_knl/knl/globals.c | 10 +- mkrtos_knl/knl/map.c | 2 +- mkrtos_knl/knl/sema.c | 3 +- mkrtos_knl/knl/share_mem.c | 160 +++++++++---- mkrtos_knl/knl/sleep.c | 13 +- mkrtos_knl/knl/syscall.c | 2 +- mkrtos_knl/knl/task.c | 1 - mkrtos_knl/knl/thread.c | 60 ----- mkrtos_user/lib/libc_backend/inc/fd_map.h | 1 + mkrtos_user/lib/libc_backend/inc/fs_backend.h | 2 + .../lib/libc_backend/inc/syscall_backend.h | 22 +- .../lib/libc_backend/src/aarch64/mm_backend.c | 35 ++- .../libc_backend/src/armv7_8m/mm_backend.c | 28 ++- mkrtos_user/lib/libc_backend/src/fd_map.c | 5 +- mkrtos_user/lib/libc_backend/src/fs_backend.c | 161 +++++++------ .../lib/libc_backend/src/shm_backend.c | 215 ++++++++++++++++++ mkrtos_user/lib/mlibc/include/limits.h | 2 +- mkrtos_user/lib/mlibc/src/ipc/shmat.c | 11 +- mkrtos_user/lib/mlibc/src/ipc/shmctl.c | 8 +- mkrtos_user/lib/mlibc/src/ipc/shmdt.c | 8 +- mkrtos_user/lib/mlibc/src/ipc/shmget.c | 8 +- mkrtos_user/lib/mlibc/src/unistd/ftruncate.c | 8 +- mkrtos_user/lib/sys/inc/u_share_mem.h | 1 + mkrtos_user/lib/sys/inc/u_types.h | 8 +- mkrtos_user/lib/sys/src/u_share_mem.c | 23 +- mkrtos_user/lib/sys_svr/inc/fs_cli.h | 2 +- mkrtos_user/lib/sys_svr/src/fs_cli.c | 14 +- mkrtos_user/lib/sys_svr/src/ns_cli.c | 43 +++- mkrtos_user/lib/sys_svr/src/pm_cli.c | 16 +- mkrtos_user/lib/sys_util/src/u_fast_ipc.c | 4 +- mkrtos_user/server/fs/fatfs/main.c | 2 +- mkrtos_user/server/init/src/init.c | 3 +- mkrtos_user/server/init/src/ns.c | 12 +- mkrtos_user/server/init/src/nsfs/ns.c | 10 +- mkrtos_user/user/app/test/main.c | 8 +- mkrtos_user/user/app/test/net_test.c | 9 +- mkrtos_user/user/app/test/shm_test.c | 104 +++++++++ mkrtos_user/user/app/test/shm_test.h | 4 + 41 files changed, 781 insertions(+), 260 deletions(-) create mode 100644 mkrtos_user/lib/libc_backend/src/shm_backend.c create mode 100644 mkrtos_user/user/app/test/shm_test.c create mode 100644 mkrtos_user/user/app/test/shm_test.h diff --git a/.vscode/settings.json b/.vscode/settings.json index 97aab81ec..42077ea02 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -216,7 +216,12 @@ "cm_backtrace.h": "c", "xprintf.h": "c", "cmb_def.h": "c", - "getopt.h": "c" + "getopt.h": "c", + "shm.h": "c", + "endian.h": "c", + "ipc.h": "c", + "stdarg.h": "c", + "ipcstat.h": "c" }, "cortex-debug.showRTOS": false, "cortex-debug.variableUseNaturalFormat": true, diff --git a/TODO.md b/TODO.md index 7dfa1cf71..66bb1a5c5 100644 --- a/TODO.md +++ b/TODO.md @@ -17,8 +17,9 @@ * [x] 删除之前用于log的sem * [x] 集成cmbacktrace * [x] 新进程中env支持 +* [x] 文件系统 & 网络协议栈完善自动删除支持(文件描述符自动管理库) * [ ] FPU完整支持,fastipc FPU支持 -* [ ] 文件系统 & 网络协议栈完善自动删除支持(文件描述符自动管理库) +* [ ] 驱动支持自动回收文件描述符 * [ ] 线程占用率统计 * [ ] procfs支持 * [ ] dup, dup2等接口支持 diff --git a/mkrtos_knl/knl/access.c b/mkrtos_knl/knl/access.c index 6d9d1e289..4c206cd47 100644 --- a/mkrtos_knl/knl/access.c +++ b/mkrtos_knl/knl/access.c @@ -42,9 +42,6 @@ bool_t is_rw_access(task_t *tg_task, void *addr, size_t size, bool_t ignore_null { return TRUE; } -#if IS_ENABLED(CONFIG_MMU) -/*TODO:*/ -#endif return FALSE; #else return TRUE; diff --git a/mkrtos_knl/knl/globals.c b/mkrtos_knl/knl/globals.c index d4ad95311..cfd1713c7 100755 --- a/mkrtos_knl/knl/globals.c +++ b/mkrtos_knl/knl/globals.c @@ -76,7 +76,7 @@ INIT_MEM(mem_sys_init); #if IS_ENABLED(CONFIG_DTBO_SUPPORT) static void dts_parse(void) { - printk("init dts parsing.\n"); + printk("init dtbo parsing.\n"); addr_t entry; size_t size; void *fdt; @@ -85,16 +85,12 @@ static void dts_parse(void) assert(fdt); int fdt_size = fdt_totalsize(fdt); - printk("fdt_size:%d\n", fdt_size); + printk("dtbo: fdt_size:%d\n", fdt_size); fdt32_t magic = fdt_get_header(fdt, magic); assert(magic == 0xd00dfeed); fdt32_t version = fdt_get_header(fdt, version); - printk("0x%x 0x%0x\n", magic, version); - // #if !IS_ENABLED(CONFIG_MMU) - // dts_read_mem_node(fdt); - // dts_read_flash_node(fdt); - // #endif + printk("dtbo: 0x%x 0x%0x\n", magic, version); } INIT_ONBOOT(dts_parse); #endif diff --git a/mkrtos_knl/knl/map.c b/mkrtos_knl/knl/map.c index 83ac6c60a..9e91470a0 100755 --- a/mkrtos_knl/knl/map.c +++ b/mkrtos_knl/knl/map.c @@ -20,7 +20,7 @@ bool_t obj_map_root(kobject_t *kobj, obj_space_t *obj_space, ram_limit_t *ram, v kobj_del_list_init(&kobj_list); if (obj_space_lookup_kobj(obj_space, vpage_get_obj_handler(page))) - { //!< 已经存在则解除注释 + { //!< 已经存在则删除 obj_unmap(obj_space, page, &kobj_list); } umword_t status = cpulock_lock(); diff --git a/mkrtos_knl/knl/sema.c b/mkrtos_knl/knl/sema.c index 550e00174..e867468a1 100644 --- a/mkrtos_knl/knl/sema.c +++ b/mkrtos_knl/knl/sema.c @@ -275,12 +275,11 @@ void sema_init(sema_t *obj, int cnt, int max) ref_counter_inc(&obj->ref); obj->max_cnt = max <= 0 ? 1 : max; obj->kobj.invoke_func = sema_syscall; - // obj->kobj.put_func = thread_put; obj->kobj.stage_1_func = sema_release_stage1; obj->kobj.stage_2_func = sema_release_stage2; obj->kobj.put_func = sema_put; - printk("sema init cnt:%d max:%d.\n", cnt, max); + // printk("sema init cnt:%d max:%d.\n", cnt, max); } static kobject_t *sema_func(ram_limit_t *lim, umword_t arg0, umword_t arg1, umword_t arg2, umword_t arg3) diff --git a/mkrtos_knl/knl/share_mem.c b/mkrtos_knl/knl/share_mem.c index bd25c2ab2..d5b3906cf 100644 --- a/mkrtos_knl/knl/share_mem.c +++ b/mkrtos_knl/knl/share_mem.c @@ -29,7 +29,7 @@ static slab_t *share_mem_task_node_slab; #endif /** - * @brief 存储task的节点 + * @brief store node of task. * */ typedef struct share_mem_task_node @@ -41,37 +41,38 @@ typedef struct share_mem_task_node typedef enum share_mem_type { - SHARE_MEM_CNT_BUDDY_CNT, //!< buddy分配的连续内存,最大4M,默认的内存分配方式 - SHARE_MEM_CNT_CMA_CNT, //!< cma分配的连续内存 - SHARE_MEM_CNT_DPD, //!< 离散内存 + SHARE_MEM_CNT_BUDDY_CNT, //!< Buddy allocated continuous memory, maximum 4M, default memory allocation method + SHARE_MEM_CNT_CMA_CNT, //!< Continuous memory allocated by CMA + SHARE_MEM_CNT_DPD, //!< discrete memory } share_mem_type_t; /** - * @brief 共享内存对象 + * @brief share mem kernel object. * */ typedef struct share_mem { - kobject_t kobj; //!< 内核对象 + kobject_t kobj; //!< kernel object. struct { - void *mem; //!< 内存指针(连续内存时使用) - void **mem_array; //!< 离散内存时当数组地址使用,数组内存放离散内存的地址 + void *mem; //!< Memory pointer (used when using continuous memory) + void **mem_array; //!< When using array addresses in discrete memory, array memory stores the address of discrete memory }; - size_t size; //!< 内存大小,(根据arch不同,size大小可能会被限制为,例如:n^2)。 - dlist_head_t task_head; //!< 哪些任务使用了该共享内存 - share_mem_type_t mem_type; //!< 内存类型 - ram_limit_t *lim; //!< 内存限额 - ref_counter_t ref; //!< 引用计数 + size_t size; //!< Memory size, (depending on arch, size may be limited to, for example: n^2) + dlist_head_t task_head; //!< Which tasks use the shared memory + share_mem_type_t mem_type; //!< memory type + ram_limit_t *lim; //!< memory limit + ref_counter_t ref; //!< Reference count must be zero to free kobj memory } share_mem_t; enum share_mem_op { - SHARE_MEM_MAP, - SHARE_MEM_UNMAP, + SHARE_MEM_MAP, //!lim); @@ -153,7 +154,7 @@ static int share_mem_map_task(share_mem_t *sm, vaddr_t addr) #endif if (!task_node) { - // 内存分配失败 + // memory alloc failed. ref_counter_dec_and_release(&tk->ref_cn, &tk->kobj); spinlock_set(&sm->kobj.lock, status); ret = -ENOMEM; @@ -210,8 +211,9 @@ static int share_mem_free_pmem(share_mem_t *obj) } return 0; } + /** - * @brief 申请物理内存 + * @brief alloc phy memory. * * @param obj * @return int @@ -242,14 +244,13 @@ static int share_mem_alloc_pmem(share_mem_t *obj) #if CONFIG_MPU_VERSION == 1 if (obj->size < (1UL << CONFIG_PAGE_SHIFT) || !is_power_of_2(obj->size)) { - //!< 大小必须是2的整数倍 + //!< The size must be an integer multiple of 2 return -EINVAL; } align_size = obj->size; #elif CONFIG_MPU_VERSION == 2 if (obj->size < MPU_ALIGN_SIZE || (obj->size & (MPU_ALIGN_SIZE - 1))) { - //!< 大小必须是2的整数倍 return -EINVAL; } obj->size += MPU_ALIGN_SIZE; @@ -271,7 +272,7 @@ static int share_mem_alloc_pmem(share_mem_t *obj) case SHARE_MEM_CNT_DPD: { #if IS_ENABLED(CONFIG_MMU) - /** 非连续内存,按页申请 */ + /** Non contiguous memory, requested by page */ int mem_cnt = ROUND_UP(obj->size, PAGE_SIZE); size_t mem_array_size = ALIGN(mem_cnt * sizeof(void *), PAGE_SIZE); @@ -286,7 +287,7 @@ static int share_mem_alloc_pmem(share_mem_t *obj) obj->mem_array[i] = mm_limit_alloc_buddy(obj->lim, PAGE_SIZE); if (obj->mem_array[i] == NULL) { - /* 内存不足,释放申请的内存 */ + /* Insufficient memory, release the requested memory */ mm_limit_free_buddy(obj->lim, obj->mem_array, mem_array_size); for (int j = 0; j < i; j++) { @@ -305,12 +306,63 @@ static int share_mem_alloc_pmem(share_mem_t *obj) } return 0; } +static int share_mem_pmem_resize(share_mem_t *obj, size_t new_size) +{ + int ret; + if (obj->mem) + { + return 0; + } + switch (obj->mem_type) + { + case SHARE_MEM_CNT_CMA_CNT: +#if IS_ENABLED(CONFIG_MMU) + /*TODO:support CMA mem.*/ + return -ENOSYS; +#endif + case SHARE_MEM_CNT_BUDDY_CNT: +#if IS_ENABLED(CONFIG_MMU) + mm_limit_free_buddy(obj->lim, obj->mem, ojb->size); +#else + mm_limit_free_align(obj->lim, obj->mem, obj->size); +#endif + obj->mem = NULL; + break; + case SHARE_MEM_CNT_DPD: + { +#if IS_ENABLED(CONFIG_MMU) + int mem_cnt = ROUND_UP(obj->size, PAGE_SIZE); + size_t mem_array_size = ALIGN(mem_cnt * sizeof(void *), PAGE_SIZE); + + for (int i = 0; i < mem_cnt; i++) + { + mm_limit_free_buddy(obj->lim, obj->mem_array[i], PAGE_SIZE); + } + mm_limit_free_buddy(obj->lim, obj->mem_array, mem_array_size); + obj->mem_array = NULL; +#else + return -ENOSYS; +#endif + } + break; + } + size_t old_size = obj->size; + + obj->size = new_size; + ret = share_mem_alloc_pmem(obj); + if (ret < 0) + { + obj->size = old_size; + ret = share_mem_alloc_pmem(obj); + } + return ret; +} /** - * @brief 共享内存执行映射操作 + * @brief Shared memory performs mapping operations * - * @param obj 共享内存对象 - * @param addr 映射到的虚拟地址,以及属性 - * @return int + * @param obj shared memory kernel object. + * @param addr The virtual address mapped to, as well as its attributes + * @return ssize_t */ static ssize_t share_mem_map(share_mem_t *obj, vma_addr_t addr, vaddr_t *ret_vaddr) { @@ -323,8 +375,9 @@ static ssize_t share_mem_map(share_mem_t *obj, vma_addr_t addr, vaddr_t *ret_vad #if IS_ENABLED(CONFIG_MMU) vaddr_t ret_addr; - addr.flags |= VMA_ADDR_RESV; //!< 设置为保留内存,保留内存的物理内存,不在内核中申请 - ret = task_vma_alloc(&task->mm_space.mem_vma, addr, obj->size, 0, &ret_addr); //!< 申请虚拟内存 + addr.flags |= VMA_ADDR_RESV; + //!< Set to reserve memory, physical memory that reserves memory and does not apply for it in the kernel + ret = task_vma_alloc(&task->mm_space.mem_vma, addr, obj->size, 0, &ret_addr); //!< Apply for virtual memory if (ret < 0) { return ret; @@ -366,7 +419,7 @@ static ssize_t share_mem_map(share_mem_t *obj, vma_addr_t addr, vaddr_t *ret_vad } #else - vma_addr_set_flags(&addr, vma_addr_get_flags(addr) | VMA_ADDR_RESV | VMA_ADDR_PAGE_FAULT_SIM); // 设置为保留模式 + vma_addr_set_flags(&addr, vma_addr_get_flags(addr) | VMA_ADDR_RESV | VMA_ADDR_PAGE_FAULT_SIM); // Set to reserve mode ret = task_vma_alloc(&task->mm_space.mem_vma, addr, obj->size, (vaddr_t)(obj->mem), ret_vaddr); if (ret < 0) @@ -389,7 +442,7 @@ static void share_mem_unmap_op(task_t *tk, share_mem_t *sm) { vaddr_t addr; - // 从记录中删除 + // Remove from records addr = (vaddr_t)share_mem_unmap_task(sm, tk); if (addr) { @@ -416,26 +469,30 @@ static void share_mem_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i { vma_addr_t vma_addr; vaddr_t ret_vaddr; - ret = share_mem_alloc_pmem(sm); //!< 如果内存没有申请,则申请内存 + + ref_counter_inc(&sm->ref); + ret = share_mem_alloc_pmem(sm); //!< If there is no memory request, apply for memory if (ret < 0) { + ref_counter_dec_and_release(&sm->ref, &sm->kobj); goto end; } vma_addr = vma_addr_create_raw(f->regs[0]); - ret = share_mem_map(sm, vma_addr, &ret_vaddr); //!< 执行映射操作 + ret = share_mem_map(sm, vma_addr, &ret_vaddr); //!< Perform mapping operation if (ret < 0) { + ref_counter_dec_and_release(&sm->ref, &sm->kobj); goto end; } - ret = share_mem_map_task(sm, ret_vaddr); //!< 存储那些task使用了该share mem. + ret = share_mem_map_task(sm, ret_vaddr); //!< Store tasks that use this share mem if (ret < 0) { share_mem_unmap(sm, ret_vaddr); + ref_counter_dec_and_release(&sm->ref, &sm->kobj); ret = -EAGAIN; goto end; } - ref_counter_inc(&sm->ref); f->regs[1] = (umword_t)ret_vaddr; f->regs[2] = sm->size; end: @@ -448,6 +505,23 @@ static void share_mem_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i tag = msg_tag_init4(0, 0, 0, 0); } break; + case SHARE_MEM_RESIZE: + { + mword_t status = spinlock_lock(&sm->kobj.lock); + + if (status < 0) + { + ret = -EPERM; + goto resize_end; + } + if (ref_counter_val(&sm->ref) == 1) + { + ret = share_mem_pmem_resize(sm, f->regs[0]); + } + spinlock_set(&sm->kobj.lock, status); +resize_end: + tag = msg_tag_init4(0, 0, 0, ret); + } } f->regs[0] = tag.raw; @@ -468,7 +542,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)); #if IS_ENABLED(CONFIG_MMU) share_mem_free_pmem(sm); @@ -488,8 +562,8 @@ bool_t share_mem_put(kobject_t *kobj) /** * @brief share_mem init. * - * @param fac 初始化的share_mem对象 - * @param max 最大限额值 + * @param sm Initialize share_cem object + * @param max Maximum limit value */ static void share_mem_init(share_mem_t *sm, umword_t max) { @@ -504,7 +578,7 @@ static void share_mem_init(share_mem_t *sm, umword_t max) sm->kobj.put_func = share_mem_put; } /** - * @brief 创建共享内存对象 + * @brief Create a shared memory object * * @param lim * @param max @@ -537,7 +611,7 @@ static share_mem_t *share_mem_create(ram_limit_t *lim, share_mem_type_t type, si return mem; } /** - * @brief 共享内存对象创建的回调函数 + * @brief Callback function for creating shared memory objects * * @param lim * @param arg0 @@ -558,7 +632,7 @@ static kobject_t *share_mem_func(ram_limit_t *lim, umword_t arg0, umword_t arg1, return &irq->kobj; } /** - * @brief 工厂注册函数 + * @brief Factory registration function * */ static void share_mem_register(void) diff --git a/mkrtos_knl/knl/sleep.c b/mkrtos_knl/knl/sleep.c index d5f2ce99e..341789ed0 100644 --- a/mkrtos_knl/knl/sleep.c +++ b/mkrtos_knl/knl/sleep.c @@ -48,11 +48,9 @@ void thread_check_timeout(void) thread_wait_entry_t *next = slist_next_entry( pos, (slist_head_t *)wait_list, node); - // pos->times_debug++; if (pos->times != 0) { pos->times--; - // pos->times_debug = 0; if (pos->times == 0) { assert(pos->th->status == THREAD_SUSPEND); @@ -62,16 +60,7 @@ void thread_check_timeout(void) thread_ready(pos->th, TRUE); } } - } else { - // if (pos->times_debug >= 3000) - // { - // printk("thread:0x%x block times %d.\n", pos->th, pos->times_debug); - // } - } // !< 如果是0,则一直休眠 - // if (pos->times_debug%2000 == 0) - // { - // // printk("thread 0x%x block %d sec.\n", pos->th, pos->times_debug /1000); - // } + } pos = next; } } diff --git a/mkrtos_knl/knl/syscall.c b/mkrtos_knl/knl/syscall.c index 9553581cb..a62c22e87 100644 --- a/mkrtos_knl/knl/syscall.c +++ b/mkrtos_knl/knl/syscall.c @@ -44,7 +44,7 @@ void syscall_entry(entry_frame_t *entry) { kobj->invoke_func(kobj, sys_p, msg_tag_init(entry->regs[0]), entry); } - cpulock_set(status); + cpulock_set(status); end:; #if !IS_ENABLED(CONFIG_MMU) addr_t u_sp = arch_get_user_sp(); diff --git a/mkrtos_knl/knl/task.c b/mkrtos_knl/knl/task.c index a961a8866..837656f8c 100755 --- a/mkrtos_knl/knl/task.c +++ b/mkrtos_knl/knl/task.c @@ -557,7 +557,6 @@ static void task_release_stage2(kobject_t *kobj) thread_sched(TRUE); // arch_to_sche(); // } - // mm_trace(); printk("release tk %x, name is:%s\n", tk, kobject_get_name(&tk->kobj)); } void task_kill(task_t *tk) diff --git a/mkrtos_knl/knl/thread.c b/mkrtos_knl/knl/thread.c index 77e418d96..5f7e96bf6 100755 --- a/mkrtos_knl/knl/thread.c +++ b/mkrtos_knl/knl/thread.c @@ -160,20 +160,6 @@ static bool_t thread_put(kobject_t *kobj) } static void thread_release_stage1_impl(thread_t *th) { - // int is_wait_suspend = 0; - - - // while(stack_len(&th->com->fast_ipc_stack)!=0) - // { - // thread_sleep(1); - // is_wait_suspend = 1; - // } - // if (is_wait_suspend) - // { - // while (th->status != THREAD_SUSPEND) { - // thread_sleep(1); - // } - // } if (stack_len(&th->com->fast_ipc_stack)==0){ //处于ipc通信中,不能直接删除,否者会立刻中断ipc中的执行 if (th->status == THREAD_READY) @@ -187,52 +173,6 @@ static void thread_release_stage1_impl(thread_t *th) } else { th->ipc_status = THREAD_IPC_ABORT; } -#if 0 - thread_wait_entry_t *pos; - - slist_foreach_not_next( - pos, (slist_head_t *)pre_cpu_get_current_cpu_var(&wait_send_queue), - node_timeout) - { - assert(pos->th->status == THREAD_SUSPEND); - thread_wait_entry_t *next = slist_next_entry( - pos, (slist_head_t *)pre_cpu_get_current_cpu_var(&wait_send_queue), - node_timeout); - - if (pos->th != th) - { - pos->th->ipc_status = THREAD_IPC_ABORT; - thread_ready(pos->th, FALSE); - } - - slist_del(&pos->node_timeout); - if (slist_in_list(&pos->node)) - { - slist_del(&pos->node); - } - pos = next; - } - thread_wait_entry_t *pos2; - - slist_foreach_not_next( - pos2, (slist_head_t *)pre_cpu_get_current_cpu_var(&wait_recv_queue), - node) - { - assert(pos2->th->status == THREAD_SUSPEND); - thread_wait_entry_t *next = slist_next_entry( - pos2, (slist_head_t *)pre_cpu_get_current_cpu_var(&wait_recv_queue), - node); - - slist_del(&pos2->node); - if (pos2->th != th) - { - pos2->th->ipc_status = THREAD_IPC_ABORT; - thread_ready(pos2->th, FALSE); - } - pos2 = next; - } -#endif - } #if IS_ENABLED(CONFIG_SMP) static int thread_remote_release_stage1_handler(ipi_msg_t *msg, bool_t *is_sched) diff --git a/mkrtos_user/lib/libc_backend/inc/fd_map.h b/mkrtos_user/lib/libc_backend/inc/fd_map.h index 33acd97cf..84d456b34 100644 --- a/mkrtos_user/lib/libc_backend/inc/fd_map.h +++ b/mkrtos_user/lib/libc_backend/inc/fd_map.h @@ -13,6 +13,7 @@ enum fd_type { FD_TTY, FD_FS, + FD_SHM, }; int fd_map_alloc(uint32_t svr_fd, uint32_t priv_fd, enum fd_type type); diff --git a/mkrtos_user/lib/libc_backend/inc/fs_backend.h b/mkrtos_user/lib/libc_backend/inc/fs_backend.h index 4ff372416..f32a8b743 100644 --- a/mkrtos_user/lib/libc_backend/inc/fs_backend.h +++ b/mkrtos_user/lib/libc_backend/inc/fs_backend.h @@ -2,6 +2,8 @@ #include +const char *fs_backend_cur_path(void); + long sys_be_open(va_list ap); long sys_be_open_at(va_list ap); long sys_be_close(va_list ap); diff --git a/mkrtos_user/lib/libc_backend/inc/syscall_backend.h b/mkrtos_user/lib/libc_backend/inc/syscall_backend.h index 8f9f9ea18..5774fbbfd 100644 --- a/mkrtos_user/lib/libc_backend/inc/syscall_backend.h +++ b/mkrtos_user/lib/libc_backend/inc/syscall_backend.h @@ -6,6 +6,10 @@ #include #include #include +#include +#include "sys/shm.h" +// typedef int key_t; + #define ARG_1_BE(ap, arg0, type0) \ do \ { \ @@ -105,7 +109,7 @@ umword_t be_mmap(void *start, long _offset); int be_fcntl(int fd, int cmd, void *arg); long be_chdir(const char *path); -int be_accept(int s, struct sockaddr *addr, socklen_t *addrlen); +long be_ftruncate(int fd, off_t off); // net api int be_accept(int s, struct sockaddr *addr, socklen_t *addrlen); int be_bind(int s, const struct sockaddr *name, socklen_t namelen); @@ -126,6 +130,22 @@ int be_socket(int domain, int type, int protocol); // end net api long be_clock_gettime(clockid_t clk_id, struct timespec *tp); +//shm +int be_shm_open(const char *name, int flag, mode_t mode); +int be_inner_shm_ftruncate(sd_t fd, size_t size); +int be_shm_unlink(const char *path); +long be_shm_mmap(void *start, + size_t len, + long prot, + long flags, + sd_t sd, + long _offset); + +int be_shmget(key_t key, size_t size, int flag); +void *be_shmat(int id, const void *addr, int flag); +int be_shmdt(const void *addr); +int be_shmctl(int id, int cmd, struct shmid_ds *buf); + long sys_mmap(va_list ap); long sys_set_tid_address(va_list ap); long sys_set_thread_area(va_list ap); diff --git a/mkrtos_user/lib/libc_backend/src/aarch64/mm_backend.c b/mkrtos_user/lib/libc_backend/src/aarch64/mm_backend.c index 18070ac45..c2f590cfe 100644 --- a/mkrtos_user/lib/libc_backend/src/aarch64/mm_backend.c +++ b/mkrtos_user/lib/libc_backend/src/aarch64/mm_backend.c @@ -2,17 +2,18 @@ #include "syscall_backend.h" #include "u_prot.h" #include "u_ipc.h" - #include "u_app.h" #include "cons_cli.h" #include "u_arch.h" #include "u_vmam.h" +#include "fd_map.h" #include #undef hidden #undef weak #define hidden #include -umword_t be_mmap(void *start, + +static umword_t be_mmap_alloc_mem(void *start, size_t len, long prot, long flags, @@ -65,6 +66,36 @@ umword_t be_mmap(void *start, } return addr; } + +umword_t be_mmap(void *start, + size_t len, + long prot, + long flags, + long fd, + long _offset) +{ + if (fd == -1) + { + return be_mmap_alloc_mem(start, len, prot, flags, fd, _offset); + } + fd_map_entry_t u_fd; + int ret = fd_map_get(fd, &u_fd); + + if (ret < 0) + { + return -EBADF; + } + switch (u_fd.type) + { + case FD_SHM: + { + ret = be_shm_mmap(start, len, prot, flags, u_fd.priv_fd, _offset); + } + default: + return -ENOSYS; + } + return ret; +} long sys_mmap(va_list ap) { void *start; diff --git a/mkrtos_user/lib/libc_backend/src/armv7_8m/mm_backend.c b/mkrtos_user/lib/libc_backend/src/armv7_8m/mm_backend.c index 14ccfe13b..c86ea53e1 100644 --- a/mkrtos_user/lib/libc_backend/src/armv7_8m/mm_backend.c +++ b/mkrtos_user/lib/libc_backend/src/armv7_8m/mm_backend.c @@ -7,6 +7,7 @@ #include "u_arch.h" #include "u_mutex.h" #include "u_hd_man.h" +#include "fd_map.h" #include #include #include @@ -176,18 +177,39 @@ umword_t be_mmap2(void *start, long _offset) { umword_t addr; + mword_t ret; if (len == 0) { return 0; } - int ret = _sys_mmap2(start, len, prot, flags, fd, _offset, &addr); + if (fd == -1) + { + ret = _sys_mmap2(start, len, prot, flags, fd, _offset, &addr); + if (ret < 0) + { + return ret; + } + return addr; + } + fd_map_entry_t u_fd; + ret = fd_map_get(fd, &u_fd); if (ret < 0) { - return (umword_t)ret; + return -EBADF; } - return addr; + switch (u_fd.type) + { + case FD_SHM: + { + ret = be_shm_mmap(start, len, prot, flags, u_fd.priv_fd, _offset); + } + break; + default: + return -ENOSYS; + } + return ret; } long sys_mmap2(va_list ap) { diff --git a/mkrtos_user/lib/libc_backend/src/fd_map.c b/mkrtos_user/lib/libc_backend/src/fd_map.c index 0330dfd95..4f46e60d2 100644 --- a/mkrtos_user/lib/libc_backend/src/fd_map.c +++ b/mkrtos_user/lib/libc_backend/src/fd_map.c @@ -1,7 +1,7 @@ /** * @file fd_map.c * @author your name (1358745329@qq.com) - * @brief fd映射层 + * @brief fd map layer * @version 0.1 * @date 2024-08-08 * @@ -108,13 +108,16 @@ int fd_map_get(int fd, fd_map_entry_t *new_entry) } int row_inx = fd / CONFIG_FD_MAP_ROW_CN; int inx = fd % CONFIG_FD_MAP_ROW_CN; + pthread_spin_lock(&fd_map.lock); if (fd_map.row[row_inx] == NULL) { + pthread_spin_unlock(&fd_map.lock); return -1; } *new_entry = fd_map.row[row_inx]->entry[inx]; + pthread_spin_unlock(&fd_map.lock); return 0; } /** diff --git a/mkrtos_user/lib/libc_backend/src/fs_backend.c b/mkrtos_user/lib/libc_backend/src/fs_backend.c index 743c76420..440e0acdd 100644 --- a/mkrtos_user/lib/libc_backend/src/fs_backend.c +++ b/mkrtos_user/lib/libc_backend/src/fs_backend.c @@ -25,6 +25,7 @@ #include "svr_path.h" #include "u_mutex.h" #include "u_hd_man.h" +#include "ns_cli.h" #define FS_PATH_LEN 64 static char cur_path[FS_PATH_LEN] = "/"; @@ -47,6 +48,7 @@ void fs_backend_init(void) } else { + // init进程直接分配假的fd即可,不用调用be_open打开 assert(fd_map_alloc(0, 0, FD_TTY) >= 0); assert(fd_map_alloc(0, 1, FD_TTY) >= 0); assert(fd_map_alloc(0, 2, FD_TTY) >= 0); @@ -58,12 +60,30 @@ void fs_backend_init(void) be_chdir(pwd); } } +const char *fs_backend_cur_path(void) +{ + return cur_path; +} void fs_cons_write(void *buf, size_t size) { u_mutex_lock(&lock_cons, 0, NULL); ulog_write_bytes(u_get_global_env()->log_hd, buf, size); u_mutex_unlock(&lock_cons); } +#define SHM_DEV_PATH "/dev/shm/" +enum path_type +{ + PATH_SHM, + PATH_FS, +}; +static enum path_type be_path_type(const char *path) +{ + if (memcmp(SHM_DEV_PATH, path, 9) == 0) + { + return PATH_SHM; + } + return PATH_FS; +} int be_open(const char *path, int flags, mode_t mode) { int fd; @@ -75,6 +95,20 @@ int be_open(const char *path, int flags, mode_t mode) char new_path[FS_PATH_LEN]; // FIXME:动态申请 u_rel_path_to_abs(cur_path, path, new_path); + if (be_path_type(new_path) == PATH_SHM) + { + // 共享内存的路径是固定的 + fd = be_shm_open(new_path, flags, mode); + if (fd < 0) + { + if (fd == -EISDIR) + { + goto next; + } + } + return fd; + } +next: fd = fs_open(new_path, flags, mode); if (fd < 0) { @@ -138,44 +172,6 @@ long sys_be_close(va_list ap) return be_close(fd); } -#if 0 -static int be_tty_read(char *buf, long size) -{ - pid_t pid; - int len; - int r_len = 0; - - if (size == 0) - { - return 0; - } - task_get_pid(TASK_THIS, (umword_t *)(&pid)); - - while (r_len < size) - { - if (pid == 0) - { - len = ulog_read_bytes(u_get_global_env()->log_hd, buf + r_len, size - r_len); - } - else - { - len = cons_read(buf + r_len, size - r_len); - } - if (len < 0) - { - return len; - } - else if (len == 0) - { - u_sema_down(SEMA_PROT, 0 /*TODO:*/, NULL); - continue; - } - r_len += len; - break; - } - return r_len; -} -#endif long be_read(long fd, char *buf, long size) { fd_map_entry_t u_fd; @@ -254,34 +250,7 @@ long be_readv(long fd, const struct iovec *iov, long iovcnt) { case FD_TTY: { -#if 0 - pid_t pid; - int read_cn; - - task_get_pid(TASK_THIS, (umword_t *)(&pid)); - if (pid == 0) - { - read_cn = ulog_read_bytes(u_get_global_env()->log_hd, iov[i].iov_base, iov[i].iov_len); - } - else - { - again_read: - read_cn = cons_read(iov[i].iov_base, iov[i].iov_len); - if (read_cn < 0) - { - return read_cn; - } - else if (read_cn == 0) - { - u_sema_down(SEMA_PROT, 0, NULL); - cons_write_str(".\n"); - goto again_read; - } - } - wlen += read_cn; -#else return -ENOSYS; -#endif } break; case FD_FS: @@ -512,7 +481,33 @@ long be_unlink(const char *path) { char new_src_path[FS_PATH_LEN]; // FIXME:动态申请 u_rel_path_to_abs(cur_path, path, new_src_path); - return fs_unlink(new_src_path); + + int path_len = strlen(path); + char *parent_last_path; + + if (new_src_path[path_len - 1] == '/') + { + new_src_path[path_len - 1] = '\0'; + } + + parent_last_path = strrchr(new_src_path, '/'); + if (parent_last_path) + { + if (parent_last_path == new_src_path) + { + return -EINVAL; + } + *parent_last_path = '\0'; + } + obj_handler_t hd; + int ret = ns_query(new_src_path, &hd, 0); + + if (ret < 0) + { + return ret; + } + *parent_last_path = '/'; + return fs_unlink(hd, ret == 0 ? new_src_path : parent_last_path); } long be_poll(struct pollfd *fds, nfds_t n, int timeout) { @@ -585,6 +580,37 @@ long sys_be_getdents(va_list ap) return be_getdents(fd, buf, size); } +long be_ftruncate(int fd, off_t off) +{ + fd_map_entry_t u_fd; + int ret = fd_map_get(fd, &u_fd); + + if (ret < 0) + { + return -EBADF; + } + switch (u_fd.type) + { + case FD_TTY: + { + return -ENOSYS; + } + break; + case FD_FS: + { + ret = fs_ftruncate(u_fd.priv_fd, off); + } + break; + case FD_SHM: + { + ret = be_inner_shm_ftruncate(u_fd.priv_fd, off); + } + break; + default: + return -ENOSYS; + } + return ret; +} long sys_be_ftruncate(va_list ap) { long fd; @@ -593,8 +619,7 @@ long sys_be_ftruncate(va_list ap) ARG_2_BE(ap, fd, long, off, off_t); - ret = fs_ftruncate(fd, off); - + ret = be_ftruncate(fd, off); return ret; } int be_fcntl(int fd, int cmd, void *arg) diff --git a/mkrtos_user/lib/libc_backend/src/shm_backend.c b/mkrtos_user/lib/libc_backend/src/shm_backend.c new file mode 100644 index 000000000..5fa3b54d2 --- /dev/null +++ b/mkrtos_user/lib/libc_backend/src/shm_backend.c @@ -0,0 +1,215 @@ + +#include "syscall_backend.h" +#include +#include +#include +#include "u_prot.h" +#include "u_factory.h" +#include "u_share_mem.h" +#include "u_hd_man.h" +#include "u_vmam.h" +#include "u_task.h" +#include "ns_cli.h" +#include +#include +#include "fs_backend.h" +#include +#include +static int _be_shm_open_svr(const char *shm_name) +{ + obj_handler_t shm_hd; + // char new_src_path[NAME_MAX]; + // const char *cur_path = fs_backend_cur_path(); + + // u_rel_path_to_abs(cur_path, shm_name, new_src_path); + if (ns_query_svr(shm_name, &shm_hd, 1) < 0) + { + return -ENOENT; + } + int user_fd = fd_map_alloc(0, mk_sd_init2(shm_hd, 0).raw, FD_SHM); + + if (user_fd < 0) + { + handler_del_umap(shm_hd); + } + return user_fd; +} +static int _be_shm_close_svr(int fd) +{ + fd_map_entry_t u_fd; + + int ret = fd_map_get(fd, &u_fd); + + if (ret < 0) + { + return -EBADF; + } + obj_handler_t hd = mk_sd_init_raw(u_fd.priv_fd).hd; + // int fd = mk_sd_init_raw(u_fd.priv_fd).fd; + + handler_del_umap(hd); + return 0; +} + +static int _be_shm_open(const char *shm_name, int flag, mode_t mode, size_t size) +{ + msg_tag_t tag; + obj_handler_t shm_hd; + int shm_fd; + int ret; + shm_fd = _be_shm_open_svr(shm_name); + + if (shm_fd >= 0) + { + if ((flag & O_CREAT) && (flag & O_EXCL)) + { + _be_shm_close_svr(shm_fd); + return -EEXIST; + } + return shm_fd; + } + if (shm_fd < 0) + { + shm_hd = handler_alloc(); + if (shm_hd == HANDLER_INVALID) + { + return -ENOMEM; + } + tag = facotry_create_share_mem(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, shm_hd), + SHARE_MEM_CNT_BUDDY_CNT, size); + if (msg_tag_get_val(tag) < 0) + { + return msg_tag_get_val(tag); + } + ret = ns_register(shm_name, shm_hd, mode); + if (ret < 0) + { + handler_del_umap(shm_hd); + return ret; + } + handler_free_umap(shm_hd); + shm_fd = _be_shm_open_svr(shm_name); + if (shm_fd < 0) + { + return shm_fd; + } + } + return shm_fd; +} + +int be_shmget(key_t key, size_t size, int flag) +{ + char shm_name[NAME_MAX]="/dev/shm/"; + int new_flag = 0; + + snprintf(shm_name + 9, NAME_MAX - 9, "%d", key); + + if (new_flag&IPC_CREAT) + { + new_flag|=O_CREAT; + } + if (new_flag&IPC_EXCL) + { + new_flag|=O_EXCL; + } + + return _be_shm_open(shm_name, new_flag, flag & 0777,size); +} +void *be_shmat(int id, const void *addr, int flag) +{ + fd_map_entry_t u_fd; + msg_tag_t tag; + umword_t shm_addr; + int ret; + + ret = fd_map_get(id, &u_fd); + if (ret < 0) + { + return (void *)(-EBADF); + } + obj_handler_t hd = mk_sd_init_raw(u_fd.priv_fd).hd; + // int fd = mk_sd_init_raw(u_fd.priv_fd).fd; + + /*FIXME: 缓存addr与fd的关系,在unmap时解除映射*/ + tag = share_mem_map(hd, vma_addr_create(VPAGE_PROT_RW, 0, (umword_t)addr), &shm_addr, NULL); + if (msg_tag_get_prot(tag) < 0) + { + return (void *)((umword_t)msg_tag_get_prot(tag)); + } + return (void *)shm_addr; +} +int be_shmdt(const void *addr) +{ + /*TODO:在用户态吧addr与fd的映射关系存起来*/ + return -ENOSYS; +} +int be_shmctl(int id, int cmd, struct shmid_ds *buf) +{ + fd_map_entry_t u_fd; + msg_tag_t tag; + umword_t shm_addr; + int ret; + + ret = fd_map_free(id, &u_fd); + if (ret < 0) + { + return -EBADF; + } + obj_handler_t hd = mk_sd_init_raw(u_fd.priv_fd).hd; + // int fd = mk_sd_init_raw(u_fd.priv_fd).fd; + + switch(cmd & (0xff)) + { + case IPC_STAT:/*TODO:impl me*/ + break; + case IPC_SET:/*TODO:impl me*/ + break; + case IPC_RMID:/*TODO:impl me*/ + handler_del_umap(hd); + ret = 0; + break; + default: + ret = -ENOSYS; + break; + } + return ret; +} + +int be_shm_open(const char *name, int flag, mode_t mode) +{ + return _be_shm_open(name, flag, mode, PAGE_SIZE/*default is PAGE_SIZE, fix form ftruncate interface.*/); +} +int be_inner_shm_ftruncate(sd_t fd, size_t size) +{ + msg_tag_t tag; + obj_handler_t hd = mk_sd_init_raw(fd).hd; + // int fd = mk_sd_init_raw(u_fd.priv_fd).fd; + tag = share_mem_resize(hd, size); + return msg_tag_get_val(tag); +} +#if 0 +int be_shm_unlink(const char *path) +{ + return -ENOSYS; +} +#endif +long be_shm_mmap(void *start, + size_t len, + long prot, + long flags, + sd_t sd, + long _offset) +{ + msg_tag_t tag; + umword_t shm_addr; + obj_handler_t hd = mk_sd_init_raw(sd).raw; + + // int fd = mk_sd_init_raw(u_fd.priv_fd).fd; + /*FIXME: 缓存addr与fd的关系,在unmap时解除映射*/ + tag = share_mem_map(hd, vma_addr_create(VPAGE_PROT_RW, 0, (umword_t)start), &shm_addr, NULL); + if (msg_tag_get_prot(tag) < 0) + { + return (long)msg_tag_get_prot(tag); + } + return (long)shm_addr; +} diff --git a/mkrtos_user/lib/mlibc/include/limits.h b/mkrtos_user/lib/mlibc/include/limits.h index 20e9c4bfd..ad173304a 100644 --- a/mkrtos_user/lib/mlibc/include/limits.h +++ b/mkrtos_user/lib/mlibc/include/limits.h @@ -42,7 +42,7 @@ #define PIPE_BUF 4096 #define FILESIZEBITS 64 #ifndef NAME_MAX -#define NAME_MAX 255 +#define NAME_MAX 64 //MKRTOS 256 #endif #define PATH_MAX 4096 #define NGROUPS_MAX 32 diff --git a/mkrtos_user/lib/mlibc/src/ipc/shmat.c b/mkrtos_user/lib/mlibc/src/ipc/shmat.c index 8c7407d13..5abdbd7a5 100644 --- a/mkrtos_user/lib/mlibc/src/ipc/shmat.c +++ b/mkrtos_user/lib/mlibc/src/ipc/shmat.c @@ -1,7 +1,10 @@ #include #include "syscall.h" #include "ipc.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif +#ifdef NO_LITTLE_MODE #ifndef SYS_ipc void *shmat(int id, const void *addr, int flag) { @@ -15,3 +18,9 @@ void *shmat(int id, const void *addr, int flag) return (ret > -(unsigned long)SHMLBA) ? (void *)ret : (void *)addr; } #endif +#else +void *shmat(int id, const void *addr, int flag) +{ + return (void *)__syscall_ret(be_shmat(id, addr, flag)); +} +#endif diff --git a/mkrtos_user/lib/mlibc/src/ipc/shmctl.c b/mkrtos_user/lib/mlibc/src/ipc/shmctl.c index 1c9f78c2f..613f99690 100644 --- a/mkrtos_user/lib/mlibc/src/ipc/shmctl.c +++ b/mkrtos_user/lib/mlibc/src/ipc/shmctl.c @@ -2,7 +2,9 @@ #include #include "syscall.h" #include "ipc.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif #if __BYTE_ORDER != __BIG_ENDIAN #undef SYSCALL_IPC_BROKEN_MODE #endif @@ -25,11 +27,15 @@ int shmctl(int id, int cmd, struct shmid_ds *buf) buf = &tmp; } #endif +#ifdef NO_LITTLE_MODE #ifndef SYS_ipc int r = __syscall(SYS_shmctl, id, IPC_CMD(cmd), buf); #else int r = __syscall(SYS_ipc, IPCOP_shmctl, id, IPC_CMD(cmd), 0, buf, 0); #endif +#else + int r = be_shmctl(id, IPC_CMD(cmd), buf); +#endif #ifdef SYSCALL_IPC_BROKEN_MODE if (r >= 0) switch (cmd | IPC_TIME64) { case IPC_STAT: diff --git a/mkrtos_user/lib/mlibc/src/ipc/shmdt.c b/mkrtos_user/lib/mlibc/src/ipc/shmdt.c index 572381378..e64886867 100644 --- a/mkrtos_user/lib/mlibc/src/ipc/shmdt.c +++ b/mkrtos_user/lib/mlibc/src/ipc/shmdt.c @@ -1,12 +1,18 @@ #include #include "syscall.h" #include "ipc.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif int shmdt(const void *addr) { +#ifdef NO_LITTLE_MODE #ifndef SYS_ipc return syscall(SYS_shmdt, addr); #else return syscall(SYS_ipc, IPCOP_shmdt, 0, 0, 0, addr); #endif +#else + return __syscall_ret(be_shmdt(addr)); +#endif } diff --git a/mkrtos_user/lib/mlibc/src/ipc/shmget.c b/mkrtos_user/lib/mlibc/src/ipc/shmget.c index 7521b5fa3..90a5c610d 100644 --- a/mkrtos_user/lib/mlibc/src/ipc/shmget.c +++ b/mkrtos_user/lib/mlibc/src/ipc/shmget.c @@ -2,13 +2,19 @@ #include #include "syscall.h" #include "ipc.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif int shmget(key_t key, size_t size, int flag) { if (size > PTRDIFF_MAX) size = SIZE_MAX; +#ifdef NO_LITTLE_MODE #ifndef SYS_ipc return syscall(SYS_shmget, key, size, flag); #else return syscall(SYS_ipc, IPCOP_shmget, key, size, flag); #endif +#else + return __syscall_ret(be_shmget(key, size, flag)); +#endif } diff --git a/mkrtos_user/lib/mlibc/src/unistd/ftruncate.c b/mkrtos_user/lib/mlibc/src/unistd/ftruncate.c index 54ff34bc3..918d528f2 100644 --- a/mkrtos_user/lib/mlibc/src/unistd/ftruncate.c +++ b/mkrtos_user/lib/mlibc/src/unistd/ftruncate.c @@ -1,7 +1,13 @@ #include #include "syscall.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif int ftruncate(int fd, off_t length) { +#ifdef NO_LITTLE_MODE return syscall(SYS_ftruncate, fd, __SYSCALL_LL_O(length)); +#else + return __syscall_ret(be_ftruncate(fd, length)); +#endif } diff --git a/mkrtos_user/lib/sys/inc/u_share_mem.h b/mkrtos_user/lib/sys/inc/u_share_mem.h index 807631a10..676c16a6e 100644 --- a/mkrtos_user/lib/sys/inc/u_share_mem.h +++ b/mkrtos_user/lib/sys/inc/u_share_mem.h @@ -4,3 +4,4 @@ msg_tag_t share_mem_map(obj_handler_t obj, vma_addr_t vaddr, umword_t *addr, umword_t *size); msg_tag_t share_mem_unmap(obj_handler_t obj); +msg_tag_t share_mem_resize(obj_handler_t obj, size_t new_size); diff --git a/mkrtos_user/lib/sys/inc/u_types.h b/mkrtos_user/lib/sys/inc/u_types.h index 495fd3f3e..9a0478a5a 100755 --- a/mkrtos_user/lib/sys/inc/u_types.h +++ b/mkrtos_user/lib/sys/inc/u_types.h @@ -28,11 +28,15 @@ typedef union mk_sd struct { uhmword_t hd; - uhmword_t fd; + uhmword_t fd;//只能用15bits,最高位为符号位 }; } mk_sd_t; #define mk_sd_init_raw(val) ((mk_sd_t){.raw = val}) -#define mk_sd_init2(h, f) ((mk_sd_t){.hd = h, .fd = f}) +#define mk_sd_init2(h, f) ((mk_sd_t){\ + .hd = h, \ + .fd = (f) & (~((1 << (sizeof(uhmword_t) * 8 - 1))))\ +}\ +) #define mk_sd_get_hd(sd) ((obj_handler_t)((sd).hd)) #define mk_sd_get_fd(sd) ((int)((sd).fd)) diff --git a/mkrtos_user/lib/sys/src/u_share_mem.c b/mkrtos_user/lib/sys/src/u_share_mem.c index 70b4dab87..824081298 100644 --- a/mkrtos_user/lib/sys/src/u_share_mem.c +++ b/mkrtos_user/lib/sys/src/u_share_mem.c @@ -5,8 +5,9 @@ #include "u_vmam.h" enum share_mem_op { - SHARE_MEM_MAP, - SHARE_MEM_UNMAP, + SHARE_MEM_MAP, //! RPC_GENERATION_CALL6(pm_t, PM_PROT, PM_RUN_APP, run_app, - rpc_ref_array_uint32_t_uint8_t_64_t, rpc_array_uint32_t_uint8_t_64_t, RPC_DIR_IN, RPC_TYPE_DATA, path, - rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, mem_block, - rpc_ref_array_uint32_t_uint8_t_96_t, rpc_array_uint32_t_uint8_t_96_t, RPC_DIR_IN, RPC_TYPE_DATA, params, - rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, params_len, - rpc_ref_array_uint32_t_uint8_t_64_t, rpc_array_uint32_t_uint8_t_64_t, RPC_DIR_IN, RPC_TYPE_DATA, envs, - rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, envs_len) + rpc_ref_array_uint32_t_uint8_t_64_t, rpc_array_uint32_t_uint8_t_64_t, RPC_DIR_IN, RPC_TYPE_DATA, path, + rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, mem_block, + rpc_ref_array_uint32_t_uint8_t_96_t, rpc_array_uint32_t_uint8_t_96_t, RPC_DIR_IN, RPC_TYPE_DATA, params, + rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, params_len, + rpc_ref_array_uint32_t_uint8_t_64_t, rpc_array_uint32_t_uint8_t_64_t, RPC_DIR_IN, RPC_TYPE_DATA, envs, + rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, envs_len) int pm_run_app(const char *path, int mem_block, uint8_t *params, int params_len, uint8_t *envs, int envs_len) { rpc_ref_array_uint32_t_uint8_t_64_t rpc_path = { @@ -28,14 +28,14 @@ int pm_run_app(const char *path, int mem_block, uint8_t *params, int params_len, .data = mem_block, }; rpc_ref_array_uint32_t_uint8_t_96_t rpc_params = { - .data = (uint8_t *)params?params:"", + .data = (uint8_t *)params ? params : (uint8_t *)"", .len = MIN(params_len, 96), }; rpc_int_t rpc_params_len = { .data = params_len, }; rpc_ref_array_uint32_t_uint8_t_64_t rpc_envs = { - .data = (uint8_t *)envs?envs:"", + .data = (uint8_t *)envs ? envs : (uint8_t *)"", .len = MIN(envs_len, 64), }; rpc_int_t rpc_envs_len = { diff --git a/mkrtos_user/lib/sys_util/src/u_fast_ipc.c b/mkrtos_user/lib/sys_util/src/u_fast_ipc.c index ec298a01a..43919bfac 100644 --- a/mkrtos_user/lib/sys_util/src/u_fast_ipc.c +++ b/mkrtos_user/lib/sys_util/src/u_fast_ipc.c @@ -147,10 +147,10 @@ int u_fast_ipc_init(uint8_t *stack_array, uint8_t *msg_buf_array, int stack_msgb cons_map_buf[i] = vpage_create_raw3(0, 0, handler_alloc()).raw; msg->map_buf[i] = cons_map_buf[i]; } -#if 0 +#if 1 for (int i = 0; i < stack_msgbuf_array_num; i++) { - printf("stack 0x%x %x\n", stack_array + stack_size * i, stack_size); + printf("fastipc: stack 0x%x %x\n", stack_array + stack_size * i, stack_size); } #endif msg->user[0] = (umword_t)((char *)fake_pthread + sizeof(fake_pthread)); diff --git a/mkrtos_user/server/fs/fatfs/main.c b/mkrtos_user/server/fs/fatfs/main.c index 3807f4724..cd888a7f0 100644 --- a/mkrtos_user/server/fs/fatfs/main.c +++ b/mkrtos_user/server/fs/fatfs/main.c @@ -77,7 +77,7 @@ int main(int argc, char *argv[]) res = f_mkfs("0:/", &defopt, (void *)(fs.win), FF_MAX_SS); // 第三个参数可以设置成NULL,默认使用heap memory if (res != FR_OK) { - printf("f_mkfs err.\n"); + printf("f_mkfs err:%d.\n", res); exit(-1); } else diff --git a/mkrtos_user/server/init/src/init.c b/mkrtos_user/server/init/src/init.c index 6bde476bf..513fcee9c 100644 --- a/mkrtos_user/server/init/src/init.c +++ b/mkrtos_user/server/init/src/init.c @@ -34,7 +34,7 @@ #define DEFAULT_INIT_CFG "init.cfg" #define STACK_NUM 4 -#define STACK_COM_ITME_SIZE ((2048) * STACK_NUM) +#define STACK_COM_ITME_SIZE 2048 ATTR_ALIGN(8) static uint8_t stack_coms[STACK_COM_ITME_SIZE * STACK_NUM]; static uint8_t msg_buf_coms[MSG_BUG_LEN * STACK_NUM]; @@ -68,6 +68,7 @@ int main(int argc, char *args[]) fs_ns_mkdir("/dev"); fs_ns_mkdir("/sys"); + fs_ns_mkdir("/dev/shm"); #if defined(MKRTOS_TEST_MODE) printf("test_main..\n"); test_main(); diff --git a/mkrtos_user/server/init/src/ns.c b/mkrtos_user/server/init/src/ns.c index ba49ecdac..64e1b32ce 100644 --- a/mkrtos_user/server/init/src/ns.c +++ b/mkrtos_user/server/init/src/ns.c @@ -49,7 +49,7 @@ static void fs_svr_close(int fd) } static int fs_svr_unlink(const char *path) { - return -ENOSYS; + return fs_ns_remove(path); } static int fs_svr_mkdir(char *path) { @@ -87,8 +87,17 @@ int namespace_register(const char *path, obj_handler_t hd, int type) { int ret; + if (path[0] == '\0' || (path[0] == '/' && path[1] == '\0')) + { + return -EISDIR; + } again: ret = ns_mknode(path, hd, NODE_TYPE_SVR); + if (ret < 0) + { + handler_free_umap(hd); + } +#if 0 if (ret == -EEXIST) { // 如果已经存在,则检查是否有效,否则删除它 @@ -102,6 +111,7 @@ again: return ret; } } +#endif return ret; } /** diff --git a/mkrtos_user/server/init/src/nsfs/ns.c b/mkrtos_user/server/init/src/nsfs/ns.c index 3c81fd0af..64c4ccbcc 100644 --- a/mkrtos_user/server/init/src/nsfs/ns.c +++ b/mkrtos_user/server/init/src/nsfs/ns.c @@ -257,7 +257,7 @@ int ns_delnode(const char *path) if (cur_node->type == NODE_TYPE_SVR) { #ifdef MKRTOS - handler_free_umap(cur_node->svr_hd); + handler_del_umap(cur_node->svr_hd); #else printf("ns del node:0x%lx.\n", cur_node->svr_hd); #endif @@ -372,7 +372,7 @@ int ns_find_svr_obj(const char *path, obj_handler_t *svr_hd) { return -ENOENT; } -#ifdef MKRTOS +#if 0 msg_tag_t tag; tag = task_obj_valid(TASK_THIS, svr_node->svr_hd, NULL); @@ -401,12 +401,16 @@ int ns_mknode(const char *path, obj_handler_t svr_hd, node_type_t type) char name[NS_NODE_NAME_LEN]; cur_node = ns_node_find(&dir_node, path, &ret, &cur_inx, &p_inx); - if (dir_node == NULL || dir_node->type != NODE_TYPE_DUMMY || (cur_node != NULL && cur_node->type == NODE_TYPE_SVR)) + if (dir_node == NULL || dir_node->type != NODE_TYPE_DUMMY || (cur_node != NULL)) { if (cur_node != NULL && cur_node->type == NODE_TYPE_SVR) { return -EEXIST; } + if (cur_node != NULL && cur_node->type == NODE_TYPE_DUMMY) + { + return -EISDIR; + } return -ENOENT; } // 获得节点的名字 diff --git a/mkrtos_user/user/app/test/main.c b/mkrtos_user/user/app/test/main.c index 5351c73d3..d48c81041 100644 --- a/mkrtos_user/user/app/test/main.c +++ b/mkrtos_user/user/app/test/main.c @@ -8,18 +8,18 @@ #include #include "fs_test.h" #include "mm_test.h" -#include #include "net_test.h" +#include "shm_test.h" #include "u_task.h" +#include int main(int argc, char *argv[]) { - task_set_obj_name(TASK_THIS, TASK_THIS, "tk_tst"); - task_set_obj_name(TASK_THIS, THREAD_MAIN, "th_tst"); for (int i = 0; i < argc; i++) { printf("argv[%d]: %s\n", i, argv[i]); } - // exit(-1); + posix_shem_test(); + system_v_shm_test(); net_test(); fs_test3(); fs_test2(); diff --git a/mkrtos_user/user/app/test/net_test.c b/mkrtos_user/user/app/test/net_test.c index c488f2a8b..8545af016 100644 --- a/mkrtos_user/user/app/test/net_test.c +++ b/mkrtos_user/user/app/test/net_test.c @@ -57,8 +57,8 @@ static int tcp_server(void) } printf("Client connected!\n"); - - while (1) + int test_cn = 0; + while (test_cn++ < 1000) { ssize_t bytes_received = recv(client_socket, buffer, BUFFER_SIZE - 1, 0); if (bytes_received < 0) @@ -127,16 +127,17 @@ static int tcp_client(void) { perror("recv failed"); close(server_socket); - exit(EXIT_FAILURE); + break; } #if 0 printf("client recv: %s, len:%d\n", buffer, bytes_received); #endif - usleep(1000); + // usleep(1000); } // 关闭套接字 close(server_socket); + printf("net test ok\n"); return 0; } diff --git a/mkrtos_user/user/app/test/shm_test.c b/mkrtos_user/user/app/test/shm_test.c new file mode 100644 index 000000000..fc42762a0 --- /dev/null +++ b/mkrtos_user/user/app/test/shm_test.c @@ -0,0 +1,104 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define SHM_NAME "/my_shm" +#define SHM_SIZE 1024 // 共享内存大小 + +int posix_shem_test(void) +{ + int shm_fd; + void *ptr; + + // 1. 创建共享内存对象 + shm_fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666); + if (shm_fd == -1) { + perror("shm_open"); + exit(EXIT_FAILURE); + } + + // 2. 设置共享内存大小 + if (ftruncate(shm_fd, SHM_SIZE) == -1) { + perror("ftruncate"); + exit(EXIT_FAILURE); + } + + // 3. 映射共享内存 + ptr = mmap(0, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0); + if (ptr == MAP_FAILED) { + perror("mmap"); + exit(EXIT_FAILURE); + } + + // 4. 写入数据到共享内存 + const char *message = "Hello, POSIX shared memory!"; + sprintf((char *)ptr, "%s", message); + + // 5. 读取共享内存中的数据 + printf("Data in shared memory: %s\n", (char *)ptr); + + // 6. 解除映射 + if (munmap(ptr, SHM_SIZE) == -1) { + perror("munmap"); + exit(EXIT_FAILURE); + } + + // 7. 关闭共享内存对象 + close(shm_fd); + + // 8. 删除共享内存对象 + if (shm_unlink(SHM_NAME) == -1) { + perror("shm_unlink"); + exit(EXIT_FAILURE); + } + + printf("Shared memory test completed successfully.\n"); + return 0; +} + +int system_v_shm_test(void) +{ + int shmid; + key_t key = 1234; // 共享内存的键值 + char *shmaddr; + + // 1. 创建共享内存段 + if ((shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666)) == -1) { + perror("shmget"); + exit(EXIT_FAILURE); + } + + // 2. 将共享内存映射到进程地址空间 + if ((shmaddr = shmat(shmid, NULL, 0)) == (char *)-1) { + perror("shmat"); + exit(EXIT_FAILURE); + } + + // 3. 写入数据到共享内存 + const char *message = "Hello, System V shared memory!"; + strncpy(shmaddr, message, SHM_SIZE); + + // 4. 读取共享内存中的数据 + printf("Data in shared memory: %s\n", shmaddr); + +#if 0 + // 5. 解除共享内存映射 + if (shmdt(shmaddr) == -1) { + perror("shmdt"); + exit(EXIT_FAILURE); + } +#endif + // 6. 删除共享内存段 + if (shmctl(shmid, IPC_RMID, NULL) == -1) { + perror("shmctl"); + exit(EXIT_FAILURE); + } + + printf("System V shared memory test completed successfully.\n"); + return 0; +} diff --git a/mkrtos_user/user/app/test/shm_test.h b/mkrtos_user/user/app/test/shm_test.h new file mode 100644 index 000000000..689972526 --- /dev/null +++ b/mkrtos_user/user/app/test/shm_test.h @@ -0,0 +1,4 @@ +#pragma once + +int posix_shem_test(void); +int system_v_shm_test(void);