posix shm & system v的信号量支持(未完成)
This commit is contained in:
7
.vscode/settings.json
vendored
7
.vscode/settings.json
vendored
@@ -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,
|
||||
|
||||
3
TODO.md
3
TODO.md
@@ -17,8 +17,9 @@
|
||||
* [x] 删除之前用于log的sem
|
||||
* [x] 集成cmbacktrace
|
||||
* [x] 新进程中env支持
|
||||
* [x] 文件系统 & 网络协议栈完善自动删除支持(文件描述符自动管理库)
|
||||
* [ ] FPU完整支持,fastipc FPU支持
|
||||
* [ ] 文件系统 & 网络协议栈完善自动删除支持(文件描述符自动管理库)
|
||||
* [ ] 驱动支持自动回收文件描述符
|
||||
* [ ] 线程占用率统计
|
||||
* [ ] procfs支持
|
||||
* [ ] dup, dup2等接口支持
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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, //!<share mem map to task.
|
||||
SHARE_MEM_UNMAP, //!< share mem unmap to task.
|
||||
SHARE_MEM_RESIZE, //!< share mem resize.
|
||||
};
|
||||
#if IS_ENABLED(CONFIG_BUDDY_SLAB)
|
||||
/**
|
||||
* 初始化共享内存对象的内存分配器
|
||||
* Initialize the memory allocator for shared memory objects
|
||||
*/
|
||||
static void share_mem_slab_init(void)
|
||||
{
|
||||
@@ -83,7 +84,7 @@ static void share_mem_slab_init(void)
|
||||
INIT_KOBJ_MEM(share_mem_slab_init);
|
||||
#endif
|
||||
/**
|
||||
* @brief 共享内存解除映射
|
||||
* @brief Unmapping shared memory
|
||||
*
|
||||
* @param sm
|
||||
* @return int
|
||||
@@ -116,7 +117,7 @@ static void *share_mem_unmap_task(share_mem_t *sm, task_t *tk)
|
||||
return (void *)vaddr;
|
||||
}
|
||||
/**
|
||||
* @brief 共享内存映射
|
||||
* @brief Mapping shared memory
|
||||
*
|
||||
* @param task
|
||||
*/
|
||||
@@ -144,7 +145,7 @@ static int share_mem_map_task(share_mem_t *sm, vaddr_t addr)
|
||||
|
||||
if (!flag)
|
||||
{
|
||||
// 没有找到则插入一个新的
|
||||
// If not found, insert a new one
|
||||
share_mem_task_node_t *task_node;
|
||||
#if IS_ENABLED(CONFIG_MMU)
|
||||
task_node = mm_limit_alloc_slab(share_mem_task_node_slab, tk->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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
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);
|
||||
|
||||
@@ -6,6 +6,10 @@
|
||||
#include <sys/stat.h>
|
||||
#include <time.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/ipc.h>
|
||||
#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);
|
||||
|
||||
@@ -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 <assert.h>
|
||||
#undef hidden
|
||||
#undef weak
|
||||
#define hidden
|
||||
#include <pthread_impl.h>
|
||||
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;
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "u_arch.h"
|
||||
#include "u_mutex.h"
|
||||
#include "u_hd_man.h"
|
||||
#include "fd_map.h"
|
||||
#include <pthread_impl.h>
|
||||
#include <assert.h>
|
||||
#include <u_vmam.h>
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
/**
|
||||
|
||||
@@ -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)
|
||||
|
||||
215
mkrtos_user/lib/libc_backend/src/shm_backend.c
Normal file
215
mkrtos_user/lib/libc_backend/src/shm_backend.c
Normal file
@@ -0,0 +1,215 @@
|
||||
|
||||
#include "syscall_backend.h"
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#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 <fcntl.h>
|
||||
#include <sys/ipc.h>
|
||||
#include "fs_backend.h"
|
||||
#include <fd_map.h>
|
||||
#include <limits.h>
|
||||
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;
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
#include <sys/shm.h>
|
||||
#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
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
#include <endian.h>
|
||||
#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:
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
#include <sys/shm.h>
|
||||
#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
|
||||
}
|
||||
|
||||
@@ -2,13 +2,19 @@
|
||||
#include <stdint.h>
|
||||
#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
|
||||
}
|
||||
|
||||
@@ -1,7 +1,13 @@
|
||||
#include <unistd.h>
|
||||
#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
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -5,8 +5,9 @@
|
||||
#include "u_vmam.h"
|
||||
enum share_mem_op
|
||||
{
|
||||
SHARE_MEM_MAP,
|
||||
SHARE_MEM_UNMAP,
|
||||
SHARE_MEM_MAP, //!<share mem map to task.
|
||||
SHARE_MEM_UNMAP, //!< share mem unmap to task.
|
||||
SHARE_MEM_RESIZE, //!< share mem resize.
|
||||
};
|
||||
MK_SYSCALL
|
||||
msg_tag_t share_mem_map(obj_handler_t obj, vma_addr_t vaddr, umword_t *addr, umword_t *size)
|
||||
@@ -52,3 +53,21 @@ msg_tag_t share_mem_unmap(obj_handler_t obj)
|
||||
: ARCH_REG_0);
|
||||
return msg_tag_init(r0);
|
||||
}
|
||||
MK_SYSCALL
|
||||
msg_tag_t share_mem_resize(obj_handler_t obj, size_t new_size)
|
||||
{
|
||||
register volatile umword_t r0 asm(ARCH_REG_0);
|
||||
mk_syscall(syscall_prot_create4(SHARE_MEM_RESIZE, SHARE_MEM_PROT, obj, FALSE).raw,
|
||||
new_size,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
asm __volatile__(""
|
||||
:
|
||||
:
|
||||
: ARCH_REG_0);
|
||||
return msg_tag_init(r0);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ int fs_fstat(sd_t _fd, stat_t *stat);
|
||||
int fs_ioctl(sd_t _fd, int req, void *arg);
|
||||
int fs_fcntl(sd_t _fd, int cmd, void *arg);
|
||||
int fs_fsync(sd_t _fd);
|
||||
int fs_unlink(const char *path);
|
||||
int fs_unlink(obj_handler_t hd, const char *path);
|
||||
int fs_symlink(const char *src, const char *dst);
|
||||
int fs_mkdir(char *path);
|
||||
int fs_rmdir(char *path);
|
||||
|
||||
@@ -349,19 +349,11 @@ int fs_fsync(sd_t _fd)
|
||||
/*int unlink(const char *path)*/
|
||||
RPC_GENERATION_CALL1(fs_t, FS_PROT, FS_UNLINK, unlink,
|
||||
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path)
|
||||
int fs_unlink(const char *path)
|
||||
int fs_unlink(obj_handler_t hd, const char *path)
|
||||
{
|
||||
obj_handler_t hd;
|
||||
int ret = ns_query(path, &hd, 0);
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
rpc_ref_file_array_t rpc_path = {
|
||||
.data = (uint8_t *)(&path[ret]),
|
||||
.len = strlen(&path[ret]) + 1,
|
||||
.data = (uint8_t *)(path),
|
||||
.len = strlen(path) + 1,
|
||||
};
|
||||
|
||||
msg_tag_t tag = fs_t_unlink_call(hd, &rpc_path);
|
||||
|
||||
@@ -23,9 +23,10 @@ typedef struct ns_cli_cache
|
||||
} ns_cli_cache_t;
|
||||
|
||||
static ns_cli_cache_t ns_cli_cache;
|
||||
static pthread_spinlock_t ns_cli_cache_lock;
|
||||
|
||||
/**
|
||||
* @brief TODO:加锁
|
||||
* @brief
|
||||
*
|
||||
* @param path
|
||||
* @param split_pos
|
||||
@@ -35,10 +36,13 @@ static obj_handler_t find_hd(const char *path, int *split_pos)
|
||||
{
|
||||
int i = 0;
|
||||
int empty = -1;
|
||||
|
||||
pthread_spin_lock(&ns_cli_cache_lock);
|
||||
for (i = 0; i < NS_CLI_CACHE_NR; i++)
|
||||
{
|
||||
if (ns_cli_cache.cache[i].path[0] != 0)
|
||||
{
|
||||
#if 0
|
||||
char *new_str = strstr(path, ns_cli_cache.cache[i].path);
|
||||
if (new_str && (new_str == path))
|
||||
{
|
||||
@@ -46,16 +50,31 @@ static obj_handler_t find_hd(const char *path, int *split_pos)
|
||||
{
|
||||
*split_pos = (int)(strlen(ns_cli_cache.cache[i].path));
|
||||
}
|
||||
pthread_spin_unlock(&ns_cli_cache_lock);
|
||||
return ns_cli_cache.cache[i].hd;
|
||||
}
|
||||
#else
|
||||
if (strcmp(ns_cli_cache.cache[i].path, path) == 0)
|
||||
{
|
||||
if (split_pos)
|
||||
{
|
||||
*split_pos = (int)(strlen(ns_cli_cache.cache[i].path));
|
||||
}
|
||||
pthread_spin_unlock(&ns_cli_cache_lock);
|
||||
return ns_cli_cache.cache[i].hd;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
pthread_spin_unlock(&ns_cli_cache_lock);
|
||||
return HANDLER_INVALID;
|
||||
}
|
||||
static bool_t reg_hd(const char *path, obj_handler_t hd, int split_inx)
|
||||
{
|
||||
int i = 0;
|
||||
int empty = -1;
|
||||
|
||||
pthread_spin_lock(&ns_cli_cache_lock);
|
||||
for (i = 0; i < NS_CLI_CACHE_NR; i++)
|
||||
{
|
||||
if (ns_cli_cache.cache[i].path[0] == 0)
|
||||
@@ -63,15 +82,19 @@ static bool_t reg_hd(const char *path, obj_handler_t hd, int split_inx)
|
||||
strncpy(ns_cli_cache.cache[i].path, path, split_inx);
|
||||
ns_cli_cache.cache[i].path[split_inx] = 0;
|
||||
ns_cli_cache.cache[i].hd = hd;
|
||||
pthread_spin_unlock(&ns_cli_cache_lock);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
pthread_spin_unlock(&ns_cli_cache_lock);
|
||||
return FALSE;
|
||||
}
|
||||
static void del_hd(obj_handler_t hd)
|
||||
{
|
||||
int i = 0;
|
||||
int empty = -1;
|
||||
|
||||
pthread_spin_lock(&ns_cli_cache_lock);
|
||||
for (i = 0; i < NS_CLI_CACHE_NR; i++)
|
||||
{
|
||||
if (ns_cli_cache.cache[i].path[0] != 0 && ns_cli_cache.cache[i].hd == hd)
|
||||
@@ -80,6 +103,7 @@ static void del_hd(obj_handler_t hd)
|
||||
ns_cli_cache.cache[i].hd = 0;
|
||||
}
|
||||
}
|
||||
pthread_spin_unlock(&ns_cli_cache_lock);
|
||||
}
|
||||
|
||||
RPC_GENERATION_CALL3(ns_t, NS_PROT, NS_REGISTER_OP, register,
|
||||
@@ -175,13 +199,18 @@ next:
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (reg_hd(path, newfd, msg_tag_get_val(tag)) == FALSE)
|
||||
int s_inx = msg_tag_get_val(tag);
|
||||
|
||||
if (s_inx == strlen(path))
|
||||
{
|
||||
printf("The client service cache is full.\n");
|
||||
#if 0
|
||||
handler_free_umap(newfd);
|
||||
return -ENOMEM;
|
||||
#endif
|
||||
if (reg_hd(path, newfd, msg_tag_get_val(tag)) == FALSE)
|
||||
{
|
||||
printf("The client service cache is full.\n");
|
||||
#if 0
|
||||
handler_free_umap(newfd);
|
||||
return -ENOMEM;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
*svr_hd = newfd;
|
||||
return msg_tag_get_val(tag);
|
||||
|
||||
@@ -12,12 +12,12 @@
|
||||
#include <assert.h>
|
||||
|
||||
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 = {
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
// 获得节点的名字
|
||||
|
||||
@@ -8,18 +8,18 @@
|
||||
#include <u_vmam.h>
|
||||
#include "fs_test.h"
|
||||
#include "mm_test.h"
|
||||
#include <u_sleep.h>
|
||||
#include "net_test.h"
|
||||
#include "shm_test.h"
|
||||
#include "u_task.h"
|
||||
#include <u_sleep.h>
|
||||
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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
104
mkrtos_user/user/app/test/shm_test.c
Normal file
104
mkrtos_user/user/app/test/shm_test.c
Normal file
@@ -0,0 +1,104 @@
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/shm.h>
|
||||
#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;
|
||||
}
|
||||
4
mkrtos_user/user/app/test/shm_test.h
Normal file
4
mkrtos_user/user/app/test/shm_test.h
Normal file
@@ -0,0 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
int posix_shem_test(void);
|
||||
int system_v_shm_test(void);
|
||||
Reference in New Issue
Block a user