posix shm & system v的信号量支持(未完成)

This commit is contained in:
zhangzheng
2025-03-18 21:18:26 +08:00
parent f91973e6b0
commit 347a1372bc
41 changed files with 781 additions and 260 deletions

View File

@@ -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,

View File

@@ -17,8 +17,9 @@
* [x] 删除之前用于log的sem
* [x] 集成cmbacktrace
* [x] 新进程中env支持
* [x] 文件系统 & 网络协议栈完善自动删除支持(文件描述符自动管理库)
* [ ] FPU完整支持fastipc FPU支持
* [ ] 文件系统 & 网络协议栈完善自动删除支持(文件描述符自动管理库)
* [ ] 驱动支持自动回收文件描述符
* [ ] 线程占用率统计
* [ ] procfs支持
* [ ] dup, dup2等接口支持

View File

@@ -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;

View File

@@ -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

View File

@@ -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();

View File

@@ -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)

View File

@@ -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)

View File

@@ -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;
}
}

View File

@@ -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();

View File

@@ -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)

View File

@@ -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)

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;

View File

@@ -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)
{

View File

@@ -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;
}
/**

View File

@@ -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)

View 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;
}

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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);

View File

@@ -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))

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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 = {

View File

@@ -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));

View File

@@ -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

View File

@@ -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();

View File

@@ -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;
}
/**

View File

@@ -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;
}
// 获得节点的名字

View File

@@ -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();

View File

@@ -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;
}

View 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;
}

View File

@@ -0,0 +1,4 @@
#pragma once
int posix_shem_test(void);
int system_v_shm_test(void);