From 0bc4a32d6fa17fcb1f1e60860cba7546cc492322 Mon Sep 17 00:00:00 2001 From: zhangzheng <1358745329@qq.com> Date: Mon, 1 Jan 2024 16:57:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=85=B1=E4=BA=AB=E5=86=85?= =?UTF-8?q?=E5=AD=98=E5=AF=B9=E8=B1=A1=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 4 +- mkrtos_knl/inc/knl/dlist.h | 4 + mkrtos_knl/inc/knl/kobject.h | 1 + mkrtos_knl/inc/knl/mm.h | 8 +- mkrtos_knl/inc/knl/mm_space.h | 1 + mkrtos_knl/inc/knl/prot.h | 25 +- mkrtos_knl/knl/misc.c | 8 +- mkrtos_knl/knl/mm.c | 8 +- mkrtos_knl/knl/mm_space.c | 29 +- mkrtos_knl/knl/ram_limit.c | 8 +- mkrtos_knl/knl/share_mem.c | 291 ++++++++++++++++++ mkrtos_knl/knl/task.c | 2 +- mkrtos_knl/knl/thread_knl.c | 3 +- mkrtos_user/lib/sys/inc/u_factory.h | 3 +- mkrtos_user/lib/sys/inc/u_prot.h | 23 +- mkrtos_user/lib/sys/inc/u_share_mem.h | 5 + mkrtos_user/lib/sys/src/u_factory.c | 67 ++-- mkrtos_user/lib/sys/src/u_share_mem.c | 52 ++++ mkrtos_user/lib/sys_util/src/u_hd_man.c | 6 +- mkrtos_user/server/init/src/main.c | 1 + .../server/init/src/test/share_mem_test.c | 23 ++ mkrtos_user/server/init/src/test/test.h | 1 + 22 files changed, 497 insertions(+), 76 deletions(-) create mode 100644 mkrtos_knl/knl/share_mem.c create mode 100644 mkrtos_user/lib/sys/inc/u_share_mem.h create mode 100644 mkrtos_user/lib/sys/src/u_share_mem.c create mode 100644 mkrtos_user/server/init/src/test/share_mem_test.c diff --git a/.vscode/launch.json b/.vscode/launch.json index 6e7c7c0e6..376becfbf 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -38,8 +38,8 @@ "name": "(gdb) 启动", "type": "cppdbg", "request": "launch", - "program": "${workspaceFolder}/build/output/bootstrap.elf", - // "program": "${workspaceFolder}/build/output/mkrtos.elf", + // "program": "${workspaceFolder}/build/output/bootstrap.elf", + "program": "${workspaceFolder}/build/output/mkrtos.elf", "args": [], "stopAtEntry": true, "cwd": "${fileDirname}", diff --git a/mkrtos_knl/inc/knl/dlist.h b/mkrtos_knl/inc/knl/dlist.h index 690b38ef0..4208f2cbf 100755 --- a/mkrtos_knl/inc/knl/dlist.h +++ b/mkrtos_knl/inc/knl/dlist.h @@ -23,6 +23,10 @@ static inline void dlist_item_init(dlist_item_t *item) { item->next = NULL; } +static inline bool_t dlist_is_empty(dlist_head_t *list) +{ + return list->first == NULL; +} static inline void dlist_add(dlist_item_t *prev, dlist_item_t *item) { item->next = prev->next; diff --git a/mkrtos_knl/inc/knl/kobject.h b/mkrtos_knl/inc/knl/kobject.h index de66a48fd..3d7904a6e 100755 --- a/mkrtos_knl/inc/knl/kobject.h +++ b/mkrtos_knl/inc/knl/kobject.h @@ -43,6 +43,7 @@ enum knl_obj_type FACTORY_TYPE, SYS_TYPE, FUTEX_TYPE, + SHARE_MEM_TYPE, }; typedef struct kobject diff --git a/mkrtos_knl/inc/knl/mm.h b/mkrtos_knl/inc/knl/mm.h index 79b6071a9..9f28db339 100755 --- a/mkrtos_knl/inc/knl/mm.h +++ b/mkrtos_knl/inc/knl/mm.h @@ -11,10 +11,10 @@ typedef struct mem_heap { uint32_t magic; - union - { - char name[MEM_HEAP_NAME]; - }; + // union + // { + // char name[MEM_HEAP_NAME]; + // }; struct mem_heap *next; struct mem_heap *prev; umword_t size; diff --git a/mkrtos_knl/inc/knl/mm_space.h b/mkrtos_knl/inc/knl/mm_space.h index d784d80ef..1f0f872ec 100644 --- a/mkrtos_knl/inc/knl/mm_space.h +++ b/mkrtos_knl/inc/knl/mm_space.h @@ -36,6 +36,7 @@ void mm_space_free_pt_region(mm_space_t *m_space, region_info_t *ri); void mm_space_init(mm_space_t *mm_space, int is_knl); bool_t mm_space_add(mm_space_t *m_space, umword_t addr, umword_t size, uint8_t attrs); +void mm_space_del(mm_space_t *m_space, umword_t addr); static inline void mm_space_set_ram_block(mm_space_t *mm_space, void *mem, size_t size) { diff --git a/mkrtos_knl/inc/knl/prot.h b/mkrtos_knl/inc/knl/prot.h index 013ffceb6..ccb7e136b 100755 --- a/mkrtos_knl/inc/knl/prot.h +++ b/mkrtos_knl/inc/knl/prot.h @@ -13,18 +13,23 @@ #include "types.h" #include "err.h" -#define FACTORY_PROT 1 -#define THREAD_PROT 2 -#define TASK_PROT 3 -#define LOG_PROT 4 -#define IPC_PROT 5 -#define MM_PROT 6 -#define SYS_PROT 7 -#define FUTEX_PROT 8 -#define IRQ_PROT 9 +enum kobj_prot +{ + FACTORY_PROT = 1, + THREAD_PROT, + TASK_PROT, + LOG_PROT, + IPC_PROT, + MM_PROT, + SYS_PROT, + FUTEX_PROT, + IRQ_PROT, + SHARE_MEM_PROT, // 10 + MAX_PROT, +}; #define FACTORY_PORT_START FACTORY_PROT -#define FACTORY_FUNC_MAX (IRQ_PROT + 1) +#define FACTORY_FUNC_MAX (MAX_PROT) #define FACTORY_PORT_END FACTORY_FUNC_MAX #define MSG_TAG_KNL_ERR 0x8 diff --git a/mkrtos_knl/knl/misc.c b/mkrtos_knl/knl/misc.c index 1368b4a13..0ea1bf665 100644 --- a/mkrtos_knl/knl/misc.c +++ b/mkrtos_knl/knl/misc.c @@ -98,7 +98,7 @@ static bool_t mpu_calc( *ret_align_size = sub_region_t; -#if 1 +#if 0 printk("st:0x%x re:0x%x sub:0x%x\n region:[", region[0]->block_start_addr, region[0]->region, sub_region_t); for (int i = 0; i < 8; i++) { @@ -128,12 +128,6 @@ static bool_t mpu_calc( #endif mpu_calc_regs(region[0], region[0]->block_start_addr, ffs_t_, REGION_RWX, region[0]->region); mpu_calc_regs(region[1], region[1]->block_start_addr, ffs_t_, REGION_RWX, region[1]->region); - // region_i[2].rbar = ARM_MPU_RBAR(2, 0x20010000/*TODO:*/); - // region_i[2].rasr = ARM_MPU_RASR(0UL, ARM_MPU_AP_URO, 0UL - // , 0UL, 1UL, 1UL, 0x0/*TODO:*/, 16-1/*TODO:*/); - - // region_i[2].rbar = ARM_MPU_RBAR(2, 0x8000000 /*TODO:*/); - // region_i[2].rasr = ARM_MPU_RASR(0UL, ARM_MPU_AP_URO, 0UL, 0UL, 1UL, 1UL, 0x0 /*TODO:*/, ffs(1024 * 1024) - 1 /*TODO:*/); return TRUE; } diff --git a/mkrtos_knl/knl/mm.c b/mkrtos_knl/knl/mm.c index d2edcbab5..c49823ddf 100755 --- a/mkrtos_knl/knl/mm.c +++ b/mkrtos_knl/knl/mm.c @@ -250,10 +250,10 @@ int mem_heap_add(mem_t *_this, void *mem, uint32_t size) mem = (void *)(ALIGN((ptr_t)mem, 4)); size -= 4; - ((struct mem_heap *)mem)->name[0] = ' '; - ((struct mem_heap *)mem)->name[1] = ' '; - ((struct mem_heap *)mem)->name[2] = ' '; - ((struct mem_heap *)mem)->name[3] = ' '; + // ((struct mem_heap *)mem)->name[0] = ' '; + // ((struct mem_heap *)mem)->name[1] = ' '; + // ((struct mem_heap *)mem)->name[2] = ' '; + // ((struct mem_heap *)mem)->name[3] = ' '; ((struct mem_heap *)mem)->used = 0; umword_t status = spinlock_lock(&_this->lock); if (!_this->heap_start) diff --git a/mkrtos_knl/knl/mm_space.c b/mkrtos_knl/knl/mm_space.c index ce2c5aac1..139386596 100644 --- a/mkrtos_knl/knl/mm_space.c +++ b/mkrtos_knl/knl/mm_space.c @@ -1,12 +1,12 @@ /** * @file mm_space.c * @author ATShining (1358745329@qq.com) - * @brief + * @brief * @version 0.1 * @date 2023-09-29 - * + * * @copyright Copyright (c) 2023 - * + * */ #include "types.h" #include "util.h" @@ -31,7 +31,7 @@ void mm_space_init(mm_space_t *mm_space, int is_knl) } region_info_t *mm_space_alloc_pt_region(mm_space_t *m_space) { - for (int i = 0; i < 8; i++) + for (int i = 0; i < CONFIG_REGION_NUM; i++) { /*TODO:原子操作*/ if (m_space->pt_regions[i].region_inx < 0) @@ -58,10 +58,27 @@ bool_t mm_space_add(mm_space_t *m_space, { return FALSE; } + if (!is_power_of_2(size) || (addr & (!(size - 1))) != 0) + { + //!< 申请的大小必须是2的整数倍,而且地址也必须是2的整数倍 + mm_space_free_pt_region(m_space, ri); + return FALSE; + } mpu_calc_regs(ri, addr, ffs(size), attrs, 0); + ri->start_addr = addr; + ri->size = size; return TRUE; } -void mm_space_del(mm_space_t *m_space) +void mm_space_del(mm_space_t *m_space, umword_t addr) { - /*TODO:*/ + for (int i = 0; i < CONFIG_REGION_NUM; i++) + { + if (m_space->pt_regions[i].region_inx >= 0 && + m_space->pt_regions[i].start_addr == addr) + { + m_space->pt_regions[i].region_inx = -1; + m_space->pt_regions[i].start_addr = 0; + break; + } + } } diff --git a/mkrtos_knl/knl/ram_limit.c b/mkrtos_knl/knl/ram_limit.c index a2349dd7b..565bc1699 100755 --- a/mkrtos_knl/knl/ram_limit.c +++ b/mkrtos_knl/knl/ram_limit.c @@ -1,12 +1,12 @@ /** * @file ram_limit.c * @author ATShining (1358745329@qq.com) - * @brief + * @brief * @version 0.1 * @date 2023-09-29 - * + * * @copyright Copyright (c) 2023 - * + * */ #include "ram_limit.h" #include "types.h" @@ -25,7 +25,7 @@ bool_t ram_limit_alloc(ram_limit_t *limit, size_t size) { return FALSE; } - limit->cur += size; + limit->cur += size; // TODO:原子操作 return TRUE; } void ram_limit_free(ram_limit_t *limit, size_t size) diff --git a/mkrtos_knl/knl/share_mem.c b/mkrtos_knl/knl/share_mem.c new file mode 100644 index 000000000..91e9ef626 --- /dev/null +++ b/mkrtos_knl/knl/share_mem.c @@ -0,0 +1,291 @@ +/** + * @file share_mem.c + * @author zhangzheng (1358745329@qq.com) + * @brief + * @version 0.1 + * @date 2023-12-31 + * + * @copyright Copyright (c) 2023 + * + */ +#include +#include +#include +#include +#include +#include "mm_wrap.h" +#include "mpu.h" +#include "init.h" +#include "dlist.h" + +/** + * @brief 存储task的节点 + * + */ +typedef struct share_mem_task_node +{ + dlist_item_t node; + task_t *task; +} share_mem_task_node_t; +/** + * @brief 共享内存对象 + * + */ +typedef struct share_mem +{ + kobject_t kobj; //!< 内核对象 + void *mem; //!< 内存指针 + size_t size; //!< 内存大小,为n^2。 + dlist_head_t task_head; //!< 哪些任务使用了该共享内存 + ram_limit_t *lim; //!< 内存限额 +} share_mem_t; + +enum share_mem_op +{ + SHARE_MEM_MAP, + SHARE_MEM_UNMAP, +}; +/** + * @brief 共享内存解除映射 + * + * @param sm + * @return int + */ +static void share_mem_unmap_task(share_mem_t *sm) +{ + share_mem_task_node_t *pos; + umword_t status = spinlock_lock(&sm->kobj.lock); + + if (status < 0) + { + return; + } + task_t *tk = thread_get_current_task(); + dlist_foreach(&sm->task_head, pos, share_mem_task_node_t, node) + { + if (pos->task == tk) + { + dlist_del(&sm->task_head, &pos->node); + mm_limit_free(tk->lim, pos); + break; + } + } + spinlock_set(&sm->kobj.lock, status); +} +/** + * @brief 共享内存映射 + * + * @param task + */ +static int share_mem_map_task(share_mem_t *sm) +{ + int ret = -1; + int flag = 0; + share_mem_task_node_t *pos; + umword_t status = spinlock_lock(&sm->kobj.lock); + + if (status < 0) + { + return status; + } + task_t *tk = thread_get_current_task(); + + dlist_foreach(&sm->task_head, pos, share_mem_task_node_t, node) + { + if (pos->task == tk) + { + flag = 1; + break; + } + } + + if (!flag) + { + // 没有找到则插入一个新的 + share_mem_task_node_t *task_node = mm_limit_alloc(tk->lim, sizeof(share_mem_task_node_t)); + + if (!task_node) + { + // 内存分配失败 + ref_counter_dec_and_release(&tk->ref_cn, &tk->kobj); + spinlock_set(&sm->kobj.lock, status); + ret = -ENOMEM; + goto end; + } + dlist_item_init(&task_node->node); + task_node->task = tk; + dlist_add_head(&sm->task_head, &task_node->node); + ref_counter_inc(&tk->ref_cn); + ret = 0; + } + else + { + ret = 1; + } +end: + spinlock_set(&sm->kobj.lock, status); + return ret; +} + +static void share_mem_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f) +{ + msg_tag_t tag = msg_tag_init4(0, 0, 0, -EINVAL); + task_t *task = thread_get_current_task(); + share_mem_t *sm = container_of(kobj, share_mem_t, kobj); + + if (sys_p.prot != SHARE_MEM_PROT) + { + f->r[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; + return; + } + switch (sys_p.op) + { + case SHARE_MEM_MAP: + { + uint8_t attr; + + attr = f->r[0] & 0xff; + int map_ret = share_mem_map_task(sm); + + if (map_ret >= 0) + { + if (map_ret == 0) + { + // 共享内存映射 + bool_t ret = mm_space_add(&task->mm_space, (umword_t)(sm->mem), sm->size, attr); + + if (ret) + { + mpu_switch_to_task(task); + } + else + { + share_mem_unmap_task(sm); + map_ret == -EAGAIN; + } + } + } + f->r[1] = (umword_t)sm->mem; + f->r[2] = sm->size; + tag = msg_tag_init4(0, 0, 0, map_ret); + } + break; + case SHARE_MEM_UNMAP: + { + // 从记录中删除 + share_mem_unmap_task(sm); + // 共享内存解除映射 + mm_space_del(&task->mm_space, (umword_t)sm->mem); + mpu_switch_to_task(task); + ref_counter_dec_and_release(&task->ref_cn, &task->kobj); + tag = msg_tag_init4(0, 0, 0, 0); + } + break; + } + + f->r[0] = tag.raw; +} +static void share_mem_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); + + // 从记录中删除 + share_mem_unmap_task(sm); + // 共享内存解除映射 + mm_space_del(&task->mm_space, (umword_t)sm->mem); + mpu_switch_to_task(task); + ref_counter_dec_and_release(&task->ref_cn, &task->kobj); +} +static void share_mem_release_stage1(kobject_t *kobj) +{ + share_mem_t *sm = container_of(kobj, share_mem_t, kobj); + kobject_invalidate(kobj); +} +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)); + + mm_limit_free_align(sm->lim, sm->mem, sm->size); + mm_limit_free(sm->lim, sm); + printk("share mem 0x%x free.\n", sm); +} +/** + * @brief share_mem init. + * + * @param fac 初始化的share_mem对象 + * @param max 最大限额值 + */ +static void share_mem_init(share_mem_t *sm, umword_t max) +{ + kobject_init(&sm->kobj, SHARE_MEM_TYPE); + sm->kobj.invoke_func = share_mem_syscall; + sm->kobj.unmap_func = share_mem_unmap; + sm->kobj.stage_1_func = share_mem_release_stage1; + sm->kobj.stage_2_func = share_mem_release_stage2; +} +/** + * @brief 创建共享内存对象 + * + * @param lim + * @param max + * @return share_mem_t* + */ +static share_mem_t *share_mem_create(ram_limit_t *lim, size_t max) +{ + + if (max < PAGE_SIZE || !is_power_of_2(max)) + { + //!< 大小必须是2的整数倍 + return NULL; + } + + share_mem_t *mem = mm_limit_alloc(lim, sizeof(share_mem_t)); + + if (!mem) + { + return NULL; + } + mem->mem = mm_limit_alloc_align(lim, max, max); + if (!mem->mem) + { + mm_limit_free(lim, mem); + return NULL; + } + mem->size = max; + mem->lim = lim; + share_mem_init(mem, max); + return mem; +} +/** + * @brief 共享内存对象创建的回调函数 + * + * @param lim + * @param arg0 + * @param arg1 + * @param arg2 + * @param arg3 + * @return kobject_t* + */ +static kobject_t *share_mem_func(ram_limit_t *lim, umword_t arg0, umword_t arg1, + umword_t arg2, umword_t arg3) +{ + share_mem_t *irq = share_mem_create(lim, arg0); + + if (!irq) + { + return NULL; + } + return &irq->kobj; +} +/** + * @brief 工厂注册函数 + * + */ +static void share_mem_register(void) +{ + factory_register(share_mem_func, SHARE_MEM_PROT); +} +INIT_KOBJ(share_mem_register); diff --git a/mkrtos_knl/knl/task.c b/mkrtos_knl/knl/task.c index 4db43874e..01f241083 100755 --- a/mkrtos_knl/knl/task.c +++ b/mkrtos_knl/knl/task.c @@ -289,7 +289,7 @@ void task_init(task_t *task, ram_limit_t *ram, int is_knl) task->kobj.put_func = task_put; task->kobj.stage_1_func = task_release_stage1; task->kobj.stage_2_func = task_release_stage2; - mm_space_add(&task->mm_space, CONFIG_KNL_TEXT_ADDR, 64 * 1024 * 1024, REGION_RO); // TODO:这里应该用config.配置 + mm_space_add(&task->mm_space, CONFIG_KNL_TEXT_ADDR, CONFIG_KNL_TEXT_SIZE, REGION_RO); // TODO:这里应该用config.配置 } static bool_t task_put(kobject_t *kobj) diff --git a/mkrtos_knl/knl/thread_knl.c b/mkrtos_knl/knl/thread_knl.c index 3eec85905..72b7b3a81 100755 --- a/mkrtos_knl/knl/thread_knl.c +++ b/mkrtos_knl/knl/thread_knl.c @@ -57,7 +57,6 @@ static void knl_main(void) task_t *next = slist_next_entry(pos, &del_task_head, del_node); slist_del(&pos->del_node); { - // TODO:给init发送消息,该函数是在中断中调用的,所以这个消息只能在knl_thread中调用。 msg_tag_t tag; umword_t user_id; ipc_msg_t *msg = (ipc_msg_t *)knl_msg_buf; @@ -65,7 +64,7 @@ static void knl_main(void) msg->msg_buf[1] = pos->pid; msg->msg_buf[2] = 0; int ret = thread_ipc_call(init_thread, msg_tag_init4(0, 3, 0, 0x0005 /*PM_PROT*/), - &tag, ipc_timeout_create2(0, 0), &user_id); + &tag, ipc_timeout_create2(3000, 3000), &user_id); if (ret < 0) { diff --git a/mkrtos_user/lib/sys/inc/u_factory.h b/mkrtos_user/lib/sys/inc/u_factory.h index b4965c35d..993334332 100644 --- a/mkrtos_user/lib/sys/inc/u_factory.h +++ b/mkrtos_user/lib/sys/inc/u_factory.h @@ -6,4 +6,5 @@ msg_tag_t factory_create_irq_sender(obj_handler_t obj, vpage_t vpage); msg_tag_t factory_create_ipc(obj_handler_t obj, vpage_t vpage); msg_tag_t factory_create_thread(obj_handler_t obj, vpage_t vpage); -msg_tag_t factory_create_task(obj_handler_t obj, vpage_t vpage); \ No newline at end of file +msg_tag_t factory_create_task(obj_handler_t obj, vpage_t vpage); +msg_tag_t facotry_create_share_mem(obj_handler_t obj, vpage_t vpage, umword_t size); diff --git a/mkrtos_user/lib/sys/inc/u_prot.h b/mkrtos_user/lib/sys/inc/u_prot.h index 573ddfc30..5c4800092 100644 --- a/mkrtos_user/lib/sys/inc/u_prot.h +++ b/mkrtos_user/lib/sys/inc/u_prot.h @@ -2,15 +2,20 @@ #include "u_types.h" -#define FACTORY_PROT 1 -#define THREAD_PROT 2 -#define TASK_PROT 3 -#define LOG_PROT 4 -#define IPC_PROT 5 -#define MM_PROT 6 -#define SYS_PROT 7 -#define FUTEX_PROT 8 -#define IRQ_PROT 9 +enum kobj_prot +{ + FACTORY_PROT = 1, + THREAD_PROT, + TASK_PROT, + LOG_PROT, + IPC_PROT, + MM_PROT, + SYS_PROT, + FUTEX_PROT, + IRQ_PROT, + SHARE_MEM_PROT, + MAX_PROT, +}; #define THREAD_MAIN THREAD_PROT #define TASK_THIS TASK_PROT diff --git a/mkrtos_user/lib/sys/inc/u_share_mem.h b/mkrtos_user/lib/sys/inc/u_share_mem.h new file mode 100644 index 000000000..6ce285ec4 --- /dev/null +++ b/mkrtos_user/lib/sys/inc/u_share_mem.h @@ -0,0 +1,5 @@ +#include "u_types.h" +#include "u_prot.h" + +msg_tag_t share_mem_map(obj_handler_t obj, uint8_t attrs, umword_t *addr, umword_t *size); +msg_tag_t share_mem_unmap(obj_handler_t obj); diff --git a/mkrtos_user/lib/sys/src/u_factory.c b/mkrtos_user/lib/sys/src/u_factory.c index 618487c2a..2bf85b5a1 100644 --- a/mkrtos_user/lib/sys/src/u_factory.c +++ b/mkrtos_user/lib/sys/src/u_factory.c @@ -12,12 +12,12 @@ msg_tag_t factory_create_irq_sender(obj_handler_t obj, vpage_t vpage) register volatile umword_t r0 asm("r0"); mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj).raw, - 0, - IRQ_PROT, - vpage.raw, - 0, - 0, - 0); + 0, + IRQ_PROT, + vpage.raw, + 0, + 0, + 0); msg_tag_t tag = msg_tag_init(r0); return tag; @@ -27,12 +27,12 @@ msg_tag_t factory_create_thread(obj_handler_t obj, vpage_t vpage) register volatile umword_t r0 asm("r0"); mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj).raw, - 0, - THREAD_PROT, - vpage.raw, - 0, - 0, - 0); + 0, + THREAD_PROT, + vpage.raw, + 0, + 0, + 0); msg_tag_t tag = msg_tag_init(r0); return tag; @@ -42,12 +42,12 @@ msg_tag_t factory_create_task(obj_handler_t obj, vpage_t vpage) register volatile umword_t r0 asm("r0"); mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj).raw, - 0, - TASK_PROT, - vpage.raw, - 0, - 0, - 0); + 0, + TASK_PROT, + vpage.raw, + 0, + 0, + 0); msg_tag_t tag = msg_tag_init(r0); return tag; @@ -57,12 +57,31 @@ msg_tag_t factory_create_ipc(obj_handler_t obj, vpage_t vpage) register volatile umword_t r0 asm("r0"); mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj).raw, - 0, - IPC_PROT, - vpage.raw, - 0, - 0, - 0); + 0, + IPC_PROT, + vpage.raw, + 0, + 0, + 0); + asm __volatile__("" + : + : + : "r0"); + msg_tag_t tag = msg_tag_init(r0); + + return tag; +} +msg_tag_t facotry_create_share_mem(obj_handler_t obj, vpage_t vpage, umword_t size) +{ + register volatile umword_t r0 asm("r0"); + + mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj).raw, + 0, + SHARE_MEM_PROT, + vpage.raw, + size, + 0, + 0); asm __volatile__("" : : diff --git a/mkrtos_user/lib/sys/src/u_share_mem.c b/mkrtos_user/lib/sys/src/u_share_mem.c new file mode 100644 index 000000000..35ec52ab7 --- /dev/null +++ b/mkrtos_user/lib/sys/src/u_share_mem.c @@ -0,0 +1,52 @@ + +#include "u_prot.h" +#include "u_types.h" +#include "u_ipc.h" +enum share_mem_op +{ + SHARE_MEM_MAP, + SHARE_MEM_UNMAP, +}; + +msg_tag_t share_mem_map(obj_handler_t obj, uint8_t attrs, umword_t *addr, umword_t *size) +{ + register volatile umword_t r0 asm("r0"); + register volatile umword_t r1 asm("r1"); + register volatile umword_t r2 asm("r2"); + mk_syscall(syscall_prot_create4(SHARE_MEM_MAP, SHARE_MEM_PROT, obj, FALSE).raw, + attrs, + 0, + 0, + 0, + 0, + 0); + asm __volatile__("" + : + : + : "r0", "r1", "r2"); + if (addr) + { + *addr = r1; + } + if (size) + { + *size = r2; + } + return msg_tag_init(r0); +} +msg_tag_t share_mem_unmap(obj_handler_t obj) +{ + register volatile umword_t r0 asm("r0"); + mk_syscall(syscall_prot_create4(SHARE_MEM_UNMAP, SHARE_MEM_PROT, obj, FALSE).raw, + 0, + 0, + 0, + 0, + 0, + 0); + asm __volatile__("" + : + : + : "r0"); + return msg_tag_init(r0); +} diff --git a/mkrtos_user/lib/sys_util/src/u_hd_man.c b/mkrtos_user/lib/sys_util/src/u_hd_man.c index b5ade2103..f6f1e0ba5 100644 --- a/mkrtos_user/lib/sys_util/src/u_hd_man.c +++ b/mkrtos_user/lib/sys_util/src/u_hd_man.c @@ -4,12 +4,14 @@ #include "u_util.h" #include "u_task.h" #include "u_hd_man.h" +#include "u_prot.h" #include -#define HANDLER_START_INX 10 //!< fd开始的值,前10个内核保留 + +#define HANDLER_START_INX MAX_PROT #define HANDLER_MAX_NR (HANDLER_START_INX + \ (CONFIG_OBJ_MAP_ENTRY_SIZE) * (CONFIG_OBJ_MAP_TAB_SIZE)) //!< 单个task最大支持的hd数量 -static umword_t bitmap_handler_alloc[HANDLER_MAX_NR / WORD_BITS]; +static umword_t bitmap_handler_alloc[ROUND_UP(HANDLER_MAX_NR, WORD_BITS)]; static pthread_spinlock_t lock; void hanlder_pre_alloc(obj_handler_t inx) diff --git a/mkrtos_user/server/init/src/main.c b/mkrtos_user/server/init/src/main.c index 2ddb605bf..d6ecc2842 100644 --- a/mkrtos_user/server/init/src/main.c +++ b/mkrtos_user/server/init/src/main.c @@ -36,6 +36,7 @@ static void test(void) { #if 0 + sharea_mem_test(); printf_test(); ulog_test(); factory_test(); diff --git a/mkrtos_user/server/init/src/test/share_mem_test.c b/mkrtos_user/server/init/src/test/share_mem_test.c new file mode 100644 index 000000000..41ed9d283 --- /dev/null +++ b/mkrtos_user/server/init/src/test/share_mem_test.c @@ -0,0 +1,23 @@ +#include "u_types.h" +#include "u_prot.h" +#include "u_factory.h" +#include "u_task.h" +#include "u_hd_man.h" +#include "u_share_mem.h" +#include +#include +#include +void sharea_mem_test(void) +{ + addr_t addr; + umword_t size; + obj_handler_t hd = handler_alloc(); + assert(hd != HANDLER_INVALID); + msg_tag_t tag = facotry_create_share_mem(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, hd), 1024); + assert(msg_tag_get_prot(tag) >= 0); + tag = share_mem_map(hd, 3, &addr, &size); + assert(msg_tag_get_prot(tag) >= 0); + memset((void *)addr, 0, size); + // share_mem_unmap(hd); + handler_free_umap(hd); +} diff --git a/mkrtos_user/server/init/src/test/test.h b/mkrtos_user/server/init/src/test/test.h index 37882958c..4fe77c59a 100644 --- a/mkrtos_user/server/init/src/test/test.h +++ b/mkrtos_user/server/init/src/test/test.h @@ -16,4 +16,5 @@ void kobj_create_press_test(void); void sleep_tick(int tick); void pthread_lock_test(void); int pthread_cond_lock_test(void); +void sharea_mem_test(void); void ns_test(void);