diff --git a/.config b/.config index c54b4bb27..54f5f9cbd 100644 --- a/.config +++ b/.config @@ -1,4 +1,19 @@ -CONFIG_RTT_DIR="./" + +# +# Knl config +# +CONFIG_MK_MPU_CFG=y +CONFIG_KNL_TEXT_ADDR=0x8000000 +CONFIG_KNL_TEXT_SIZE=0x100000 +CONFIG_FT_ADDR_NR=16 +CONFIG_SYS_SCHE_HZ=1000 +CONFIG_USER_ISR_START_NO=16 +CONFIG_IRQ_REG_TAB_SIZE=80 +CONFIG_REGION_NUM=8 +CONFIG_OBJ_MAP_TAB_SIZE=4 +CONFIG_OBJ_MAP_ENTRY_SIZE=8 +CONFIG_PRINTK_CACHE_SIZE=128 +# end of Knl config # # Libc backend @@ -78,15 +93,4 @@ CONFIG_RT_USING_PIN=y # end of Using USB # end of Device Drivers -# -# Knl config -# -CONFIG_FT_ADDR_NR=16 -CONFIG_SYS_SCHE_HZ=1000 -CONFIG_USER_ISR_START_NO=16 -CONFIG_IRQ_REG_TAB_SIZE=80 -CONFIG_REGION_NUM=8 -CONFIG_OBJ_MAP_TAB_SIZE=4 -CONFIG_OBJ_MAP_ENTRY_SIZE=8 -CONFIG_PRINTK_CACHE_SIZE=128 -# end of Knl config +CONFIG_RTT_DIR="./" diff --git a/.config.old b/.config.old index db6eedf40..c54b4bb27 100644 --- a/.config.old +++ b/.config.old @@ -3,7 +3,8 @@ CONFIG_RTT_DIR="./" # # Libc backend # -CONFIG_MKRTOS_LIBC_FD_MAP_NR=128 +CONFIG_FD_MAP_ROW_CN=16 +CONFIG_FD_MAP_ROW_NR=16 # end of Libc backend # @@ -76,3 +77,16 @@ CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_USB_DEVICE is not set # end of Using USB # end of Device Drivers + +# +# Knl config +# +CONFIG_FT_ADDR_NR=16 +CONFIG_SYS_SCHE_HZ=1000 +CONFIG_USER_ISR_START_NO=16 +CONFIG_IRQ_REG_TAB_SIZE=80 +CONFIG_REGION_NUM=8 +CONFIG_OBJ_MAP_TAB_SIZE=4 +CONFIG_OBJ_MAP_ENTRY_SIZE=8 +CONFIG_PRINTK_CACHE_SIZE=128 +# end of Knl config diff --git a/mkrtos_img/CMakeLists.txt b/mkrtos_img/CMakeLists.txt index d6ce81ea0..88fb3d1a2 100755 --- a/mkrtos_img/CMakeLists.txt +++ b/mkrtos_img/CMakeLists.txt @@ -22,8 +22,9 @@ add_dependencies(mkrtos_img_dump bootstrap_dump mkrtos_dump init_dump - app_dump - # shell_dump - # fatfs_dump - # path_manager_dump + # app_dump + shell_dump + fatfs_dump + cpiofs_dump + tcc_dump ) \ No newline at end of file diff --git a/mkrtos_knl/CMakeLists.txt b/mkrtos_knl/CMakeLists.txt index 111d4cf58..f028f5c7e 100755 --- a/mkrtos_knl/CMakeLists.txt +++ b/mkrtos_knl/CMakeLists.txt @@ -5,7 +5,6 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ -D__MPU_PRESENT=1 \ -DUSE_STDPERIPH_DRIVER=1 \ -DKNL_OFFSET=$ENV{KEN_OFFSET} \ --DKNL_TEXT=$ENV{KNL_TEXT} \ -DINIT_OFFSET=$ENV{INIT_OFFSET} \ -DBOOTFS_ADDR_OFFSET=$ENV{BOOTFS_ADDR_OFFSET} \ -DSMP=1 \ @@ -53,10 +52,11 @@ add_custom_target( link_file_dump ALL COMMAND ${CMAKE_C_COMPILER} - -DKNL_TEXT=$ENV{KNL_TEXT} + # -DKNL_TEXT=$ENV{KNL_TEXT} -DKNL_DATA=$ENV{KNL_DATA} -DKNL_OFFSET=$ENV{KEN_OFFSET} -DKNL_DATA_SIZE=$ENV{KNL_DATA_SIZE} + -include ${CMAKE_SOURCE_DIR}/build/autoconf.h -E -P -<${CMAKE_CURRENT_LIST_DIR}/stm32_link.lds.S> ${CMAKE_CURRENT_LIST_DIR}/stm32_link.lds ) diff --git a/mkrtos_knl/Kconfig b/mkrtos_knl/Kconfig index 73d94b286..68e319881 100644 --- a/mkrtos_knl/Kconfig +++ b/mkrtos_knl/Kconfig @@ -1,5 +1,41 @@ menu "Knl config" + +menuconfig KNL_INFO + bool "knl info set" + default y +if KNL_INFO + config KNL_TEXT_ADDR + hex "The first address of the kernel text section" + default 0x8000000 + + config KNL_TEXT_SIZE + hex "Size of the kernel text segment." + default 0x100000 + + config KNL_DATA_ADDR + hex "knl data addr." + default 0x20000000 + + config KNL_DATA_SIZE + hex "knl data size." + default 0x2000000 + config KNL_OFFSET + hex "knl set" + default 0x2000 + + config INIT_TASK_OFFSET + hex "init task offset" + default 0x10000 + + config BOOTFS_OFFSET + hex "bootfs offset" + default 0x20000 +endif +config MK_MPU_CFG + bool "MKRTOS MPU config" + default y + config FT_ADDR_NR int "The number of addresses supported by futex." default 16 diff --git a/mkrtos_knl/arch/armv7m/core_it.c b/mkrtos_knl/arch/armv7m/core_it.c index 06a8a1b23..85d84fa66 100755 --- a/mkrtos_knl/arch/armv7m/core_it.c +++ b/mkrtos_knl/arch/armv7m/core_it.c @@ -34,6 +34,7 @@ #include "task.h" #include "thread.h" #include "map.h" +#include "thread_knl.h" /** @addtogroup Template_Project * @{ */ @@ -67,10 +68,7 @@ void NMI_Handler(void) void HardFault_Handler(void) { printk("%s\n", __FUNCTION__); - umword_t status; - status = cpulock_lock(); - task_kill(thread_get_current_task()); - cpulock_set(status); + task_knl_kill(thread_get_current(), is_run_knl()); } /** @@ -80,6 +78,7 @@ void HardFault_Handler(void) */ void MemManage_Handler(void) { + bool_t is_knl = is_run_knl(); addr_t fault_addr = (addr_t)(SCB->MMFAR); task_t *cur_task = thread_get_current_task(); umword_t status; @@ -133,10 +132,8 @@ void MemManage_Handler(void) } end: - printk("semgement fault.\n"); - status = cpulock_lock(); - task_kill(thread_get_current_task()); - cpulock_set(status); + printk("task:0x%x, semgement fault.\n", thread_get_current_task()); + task_knl_kill(thread_get_current(), is_knl); } /** @@ -146,18 +143,9 @@ end: */ void BusFault_Handler(void) { - thread_t *cur_th = thread_get_current(); - umword_t status; printk("%s\n", __FUNCTION__); - cur_th = cur_th; - /* Go to infinite loop when Bus Fault exception occurs */ - // while (1) - // { - // } - status = cpulock_lock(); - task_kill(thread_get_current_task()); - cpulock_set(status); + task_knl_kill(thread_get_current(), is_run_knl()); } /** @@ -192,10 +180,7 @@ void UsageFault_Handler(void) { printk("Division by zero error\n"); } - umword_t status; - status = cpulock_lock(); - task_kill(thread_get_current_task()); - cpulock_set(status); + task_knl_kill(thread_get_current(), is_run_knl()); } // /** diff --git a/mkrtos_knl/arch/inc/arch.h b/mkrtos_knl/arch/inc/arch.h index cbd51e9d4..803fae3cc 100755 --- a/mkrtos_knl/arch/inc/arch.h +++ b/mkrtos_knl/arch/inc/arch.h @@ -1,12 +1,12 @@ /** * @file arch.h * @author ATShining (1358745329@qq.com) - * @brief + * @brief * @version 0.1 * @date 2023-10-04 - * + * * @copyright Copyright (c) 2023 - * + * */ #pragma once @@ -34,6 +34,20 @@ __asm__ __volatile__("msr " #reg ", %0" ::"r"(_val)); \ }) +#define is_run_knl() \ + ({ \ + umword_t ret; \ + __asm__ __volatile__( \ + "mov %0, lr\n" \ + : "=r"(ret) \ + : \ + :); \ + ((ret & 0x4) ? 0 : 1); \ + }) +static bool_t is_run_kn(umword_t lr) +{ +} + void to_sche(void); static inline umword_t arch_get_sp(void) @@ -101,6 +115,5 @@ static inline umword_t intr_status(void) void sys_startup(void); - // systick.c umword_t sys_tick_cnt_get(void); diff --git a/mkrtos_knl/inc/knl/task.h b/mkrtos_knl/inc/knl/task.h index 0ff8c86d3..f09504673 100755 --- a/mkrtos_knl/inc/knl/task.h +++ b/mkrtos_knl/inc/knl/task.h @@ -16,6 +16,7 @@ typedef struct task mm_space_t mm_space; ram_limit_t *lim; ref_counter_t ref_cn; + slist_head_t del_node; pid_t pid; } task_t; diff --git a/mkrtos_knl/inc/knl/thread.h b/mkrtos_knl/inc/knl/thread.h index 9012ad655..7286918ef 100755 --- a/mkrtos_knl/inc/knl/thread.h +++ b/mkrtos_knl/inc/knl/thread.h @@ -187,3 +187,4 @@ void thread_ready(thread_t *th, bool_t is_sche); void thread_timeout_check(ssize_t tick); msg_tag_t thread_do_ipc(kobject_t *kobj, entry_frame_t *f, umword_t user_id); +int thread_ipc_call(thread_t *to_th, msg_tag_t in_tag, msg_tag_t *ret_tag, ipc_timeout_t timout, umword_t *ret_user_id); diff --git a/mkrtos_knl/inc/knl/thread_knl.h b/mkrtos_knl/inc/knl/thread_knl.h new file mode 100644 index 000000000..fbfe9961f --- /dev/null +++ b/mkrtos_knl/inc/knl/thread_knl.h @@ -0,0 +1,4 @@ +#pragma once + +#include +void task_knl_kill(thread_t *kill_thread, bool_t is_knl); diff --git a/mkrtos_knl/knl/sys.c b/mkrtos_knl/knl/sys.c index b1a4e60b4..89efff879 100755 --- a/mkrtos_knl/knl/sys.c +++ b/mkrtos_knl/knl/sys.c @@ -53,7 +53,7 @@ static void sys_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, case SYS_INFO_GET: { f->r[1] = sys_tick_cnt_get(); - f->r[2] = KNL_TEXT + BOOTFS_ADDR_OFFSET; + f->r[2] = CONFIG_KNL_TEXT_ADDR + BOOTFS_ADDR_OFFSET; tag = msg_tag_init4(0, 0, 0, 0); } break; diff --git a/mkrtos_knl/knl/task.c b/mkrtos_knl/knl/task.c index 9aec1b3f2..323a455e0 100755 --- a/mkrtos_knl/knl/task.c +++ b/mkrtos_knl/knl/task.c @@ -18,19 +18,31 @@ #include "misc.h" #include "spinlock.h" #include "string.h" +/** + * @brief 任务的操作码 + * + */ enum task_op_code { - TASK_OBJ_MAP, - TASK_OBJ_UNMAP, - TASK_ALLOC_RAM_BASE, - TASK_OBJ_VALID, - TASK_SET_PID, - TASK_GET_PID, + TASK_OBJ_MAP, //!< 进行映射操作 + TASK_OBJ_UNMAP, //!< 进行解除映射操作 + TASK_ALLOC_RAM_BASE, //!< 分配task的基础内存 + TASK_OBJ_VALID, //!< 判断一个对象是否有效 + TASK_SET_PID, //!< 设置task的pid + TASK_GET_PID, //!< 获取task的pid }; static bool_t task_put(kobject_t *kobj); static void task_release_stage1(kobject_t *kobj); static void task_release_stage2(kobject_t *kobj); +/** + * @brief 为task分配其可以使用的内存空间 + * + * @param tk + * @param lim + * @param size + * @return int + */ int task_alloc_base_ram(task_t *tk, ram_limit_t *lim, size_t size) { if (tk->mm_space.mm_block) @@ -49,10 +61,24 @@ int task_alloc_base_ram(task_t *tk, ram_limit_t *lim, size_t size) printk("task alloc size is %d, base is 0x%x\n", size + THREAD_MSG_BUG_LEN, ram); return 0; } +/** + * @brief 获取线程绑定的task + * + * @param th + * @return task_t* + */ task_t *thread_get_bind_task(thread_t *th) { return container_of(th->task, task_t, kobj); } +/** + * @brief 同时解锁两个进程,防止死锁 + * + * @param sp0 + * @param sp1 + * @param status0 + * @param status1 + */ static void task_unlock_2(spinlock_t *sp0, spinlock_t *sp1, int status0, int status1) { if (sp0 < sp1) @@ -66,6 +92,15 @@ static void task_unlock_2(spinlock_t *sp0, spinlock_t *sp1, int status0, int sta spinlock_set(sp1, status1); } } +/** + * @brief 同时加锁两个进程 + * + * @param sp0 + * @param sp1 + * @param st0 + * @param st1 + * @return int + */ static int task_lock_2(spinlock_t *sp0, spinlock_t *sp1, int *st0, int *st1) { int status0; @@ -104,6 +139,13 @@ static int task_lock_2(spinlock_t *sp0, spinlock_t *sp1, int *st0, int *st1) } return TRUE; } +/** + * @brief 设置进程的pid,只有pid为0的进程才能够设置 + * + * @param task 任务对象 + * @param pid 任务的pid + * @return int + */ int task_set_pid(task_t *task, pid_t pid) { task_t *cur_task = thread_get_current_task(); @@ -118,6 +160,14 @@ int task_set_pid(task_t *task, pid_t pid) return -EACCES; } } +/** + * @brief 进程的系统调用函数 + * + * @param kobj + * @param sys_p + * @param in_tag + * @param f + */ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f) { task_t *cur_task = thread_get_current_task(); @@ -132,19 +182,27 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i switch (sys_p.op) { - case TASK_OBJ_VALID: + case TASK_OBJ_VALID: //!< 查看某个obj在task中是否存在 { + mword_t status = spinlock_lock(&tag_task->kobj.lock); + if (status < 0) + { + tag = msg_tag_init4(0, 0, 0, -EINVAL); + break; + } kobject_t *source_kobj = obj_space_lookup_kobj(&cur_task->obj_space, f->r[1]); if (!source_kobj) { + spinlock_set(&tag_task->kobj.lock, status); tag = msg_tag_init4(0, 0, 0, -ENOENT); break; } + spinlock_set(&tag_task->kobj.lock, status); tag = msg_tag_init4(0, 0, 0, 1); } break; - case TASK_OBJ_MAP: + case TASK_OBJ_MAP://!<从一个task中映射一个对象到目标进程 { kobj_del_list_t del; int st0, st1; @@ -164,7 +222,7 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i tag = msg_tag_init4(0, 0, 0, ret); } break; - case TASK_OBJ_UNMAP: + case TASK_OBJ_UNMAP://!<解除task中一个进程的创建 { kobject_t *del_kobj; kobj_del_list_t kobj_list; @@ -175,16 +233,14 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i tag = msg_tag_init4(0, 0, 0, -EINVAL); break; } - // ref_counter_inc(&tag_task->ref_cn); kobj_del_list_init(&kobj_list); obj_unmap(&tag_task->obj_space, vpage_create_raw(f->r[1]), &kobj_list); kobj_del_list_to_do(&kobj_list); - // ref_counter_dec_and_release(&tag_task->ref_cn, &tag_task->kobj); spinlock_set(&tag_task->kobj.lock, status); tag = msg_tag_init4(0, 0, 0, 0); } break; - case TASK_ALLOC_RAM_BASE: + case TASK_ALLOC_RAM_BASE://!< 分配task所拥有的内存空间 { mword_t status = spinlock_lock(&tag_task->kobj.lock); if (status < 0) @@ -198,12 +254,12 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i spinlock_set(&tag_task->kobj.lock, status); } break; - case TASK_SET_PID: + case TASK_SET_PID://!<设置pid { tag = msg_tag_init4(0, 0, 0, task_set_pid(tag_task, f->r[0])); } break; - case TASK_GET_PID: + case TASK_GET_PID://!<获取pid { f->r[1] = tag_task->pid; tag = msg_tag_init4(0, 0, 0, 0); @@ -225,13 +281,14 @@ void task_init(task_t *task, ram_limit_t *ram, int is_knl) mm_space_init(&task->mm_space, is_knl); ref_counter_init(&task->ref_cn); ref_counter_inc(&task->ref_cn); + slist_init(&task->del_node); task->pid = -1; task->lim = ram; task->kobj.invoke_func = task_syscall_func; task->kobj.put_func = task_put; task->kobj.stage_1_func = task_release_stage1; task->kobj.stage_2_func = task_release_stage2; - mm_space_add(&task->mm_space, KNL_TEXT, 64 * 1024 * 1024, REGION_RO); // TODO: + mm_space_add(&task->mm_space, CONFIG_KNL_TEXT_ADDR, 64 * 1024 * 1024, REGION_RO); // TODO:这里应该用config.配置 } static bool_t task_put(kobject_t *kobj) diff --git a/mkrtos_knl/knl/thread.c b/mkrtos_knl/knl/thread.c index d00bb28ce..b06b675a0 100755 --- a/mkrtos_knl/knl/thread.c +++ b/mkrtos_knl/knl/thread.c @@ -583,7 +583,7 @@ again_check: end: spinlock_set(&cur_th->kobj.lock, lock_stats); } -static int thread_ipc_call(thread_t *to_th, msg_tag_t in_tag, msg_tag_t *ret_tag, ipc_timeout_t timout, umword_t *ret_user_id) +int thread_ipc_call(thread_t *to_th, msg_tag_t in_tag, msg_tag_t *ret_tag, ipc_timeout_t timout, umword_t *ret_user_id) { assert(ret_tag); int ret = -EINVAL; diff --git a/mkrtos_knl/knl/thread_knl.c b/mkrtos_knl/knl/thread_knl.c index 46ae24833..e7a801a26 100755 --- a/mkrtos_knl/knl/thread_knl.c +++ b/mkrtos_knl/knl/thread_knl.c @@ -22,31 +22,79 @@ #include "mm_wrap.h" #include "thread_armv7m.h" #include "misc.h" + +static uint8_t knl_msg_buf[THREAD_MSG_BUG_LEN]; static thread_t *knl_thread; static task_t knl_task; +static thread_t *init_thread; +static task_t *init_task; + +static slist_head_t del_task_head; +static spinlock_t del_lock; static void knl_main(void) { + umword_t status; + umword_t status2; printk("knl main run..\n"); while (1) { + task_t *pos; + + if (slist_is_empty(&del_task_head)) + { + continue; + } + + status2 = spinlock_lock(&del_lock); + if (slist_is_empty(&del_task_head)) + { + spinlock_set(&del_lock, status2); + continue; + } + slist_foreach_not_next(pos, &del_task_head, del_node) + { + task_t *next = slist_next_entry(pos, &del_task_head, del_node); + slist_del(&pos->del_node); + { + // TODO:给init发送消息,该函数是在中断中调用的,所以这个消息只能在knl_thread中调用。 + msg_tag_t tag; + umword_t user_id; + ipc_msg_t *msg = (ipc_msg_t *)knl_msg_buf; + msg->msg_buf[0] = 1; /*KILL_TASK*/ + msg->msg_buf[1] = pos->pid; + msg->msg_buf[2] = 0; + int ret = thread_ipc_call(init_thread, msg_tag_init4(0, 3, 0, 0x0005/*PM_PROT*/), + &tag, ipc_timeout_create2(0, 0), &user_id); + + if (ret < 0) + { + printk("%s:%d ret:%d\n", __func__, __LINE__, ret); + } + } + task_kill(pos); + pos = next; + } + spinlock_set(&del_lock, status2); } } - /** * 初始化内核线程 * 初始化内核任务 */ static void knl_init_1(void) { - thread_t *cur_th = thread_get_current(); + knl_thread = thread_get_current(); - thread_init(cur_th, &root_factory_get()->limit); + thread_init(knl_thread, &root_factory_get()->limit); task_init(&knl_task, &root_factory_get()->limit, TRUE); - thread_knl_pf_set(cur_th, knl_main); - thread_bind(cur_th, &knl_task.kobj); - thread_ready(cur_th, FALSE); + thread_knl_pf_set(knl_thread, knl_main); + thread_bind(knl_thread, &knl_task.kobj); + thread_set_msg_bug(knl_thread, knl_msg_buf); + thread_ready(knl_thread, FALSE); + + slist_init(&del_task_head); } INIT_STAGE1(knl_init_1); @@ -59,12 +107,13 @@ INIT_STAGE1(knl_init_1); static void knl_init_2(void) { mm_trace(); - thread_t *init_thread = thread_create(&root_factory_get()->limit); + + init_thread = thread_create(&root_factory_get()->limit); assert(init_thread); - task_t *init_task = task_create(&root_factory_get()->limit, FALSE); + init_task = task_create(&root_factory_get()->limit, FALSE); assert(init_task); - app_info_t *app = app_info_get((void *)(KNL_TEXT + INIT_OFFSET)); + app_info_t *app = app_info_get((void *)(CONFIG_KNL_TEXT_ADDR + INIT_OFFSET)); // 申请init的ram内存 assert(task_alloc_base_ram(init_task, &root_factory_get()->limit, app->i.ram_size + THREAD_MSG_BUG_LEN) >= 0); void *sp_addr = (char *)init_task->mm_space.mm_block + app->i.stack_offset - app->i.data_offset; @@ -72,7 +121,7 @@ static void knl_init_2(void) thread_set_msg_bug(init_thread, (char *)(init_task->mm_space.mm_block) + app->i.ram_size); thread_bind(init_thread, &init_task->kobj); - thread_user_pf_set(init_thread, (void *)(KNL_TEXT + INIT_OFFSET), (void *)((umword_t)sp_addr_top - 8), + thread_user_pf_set(init_thread, (void *)(CONFIG_KNL_TEXT_ADDR + INIT_OFFSET), (void *)((umword_t)sp_addr_top - 8), init_task->mm_space.mm_block, 0); assert(obj_map_root(&init_thread->kobj, &init_task->obj_space, &root_factory_get()->limit, vpage_create3(KOBJ_ALL_RIGHTS, 0, THREAD_PROT))); assert(obj_map_root(&init_task->kobj, &init_task->obj_space, &root_factory_get()->limit, vpage_create3(KOBJ_ALL_RIGHTS, 0, TASK_PROT))); @@ -90,6 +139,26 @@ static void knl_init_2(void) } INIT_STAGE2(knl_init_2); +void task_knl_kill(thread_t *kill_thread, bool_t is_knl) +{ + printk("kill task:0x%x.\n", kill_thread->task); + task_t *task = container_of(kill_thread->task, task_t, kobj); + if (!is_knl) + { + umword_t status2; + + thread_suspend(kill_thread); + status2 = spinlock_lock(&del_lock); + slist_add_append(&del_task_head, &task->del_node); + spinlock_set(&del_lock, status2); + } + else + { + printk("[knl]: knl panic.\n"); + assert(0); + } +} + static void print_mkrtos_info(void) { const char *start_info[] = { diff --git a/mkrtos_knl/stm32_link.lds.S b/mkrtos_knl/stm32_link.lds.S index 76c7f181e..9b876d88f 100755 --- a/mkrtos_knl/stm32_link.lds.S +++ b/mkrtos_knl/stm32_link.lds.S @@ -9,7 +9,7 @@ MEMORY RAM (xrw) : ORIGIN = KNL_DATA, LENGTH = KNL_DATA_SIZE /* RAM1 (xrw) : ORIGIN = 0x68000000, LENGTH = 1M */ /* RAM2 (xrw) : ORIGIN = 0x2001C000, LENGTH = 16K */ - FLASH (rx) : ORIGIN = KNL_TEXT + KNL_OFFSET, LENGTH = 64K - KNL_OFFSET + FLASH (rx) : ORIGIN = CONFIG_KNL_TEXT_ADDR + KNL_OFFSET, LENGTH = 64K - KNL_OFFSET } /* Define output sections */ diff --git a/mkrtos_script/build.sh b/mkrtos_script/build.sh index 36e8383e6..c70e3ecde 100755 --- a/mkrtos_script/build.sh +++ b/mkrtos_script/build.sh @@ -7,7 +7,6 @@ export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/ar export KEN_OFFSET=0x2000 export INIT_OFFSET=0x10000 export BOOTFS_ADDR_OFFSET=0x20000 -export KNL_TEXT=0x8000000 export KNL_DATA=0x20000000 export KNL_DATA_SIZE=32M export BOARD=STM32F2x diff --git a/mkrtos_script/build_cortex_r52.sh b/mkrtos_script/build_cortex_r52.sh index dc9d4cf1b..92f1cfb97 100755 --- a/mkrtos_script/build_cortex_r52.sh +++ b/mkrtos_script/build_cortex_r52.sh @@ -7,7 +7,6 @@ export TOOLCHAIN_LIB=/Users/ATShining/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm export KEN_OFFSET=0x2000 export INIT_OFFSET=0x10000 export BOOTFS_ADDR_OFFSET=0x20000 -export KNL_TEXT=0x8000000 export KNL_DATA=0x20000000 export KNL_DATA_SIZE=64K export BOARD=STM32F2x diff --git a/mkrtos_script/build_stm32f1.sh b/mkrtos_script/build_stm32f1.sh index 1a865cd8a..5b3c39d65 100755 --- a/mkrtos_script/build_stm32f1.sh +++ b/mkrtos_script/build_stm32f1.sh @@ -8,7 +8,6 @@ export KNL=mkrtos export KEN_OFFSET=0x2000 export INIT_OFFSET=0x10000 export BOOTFS_ADDR_OFFSET=0x20000 -export KNL_TEXT=0x8000000 export KNL_DATA=0x20000000 export KNL_DATA_SIZE=64K export ARCH=cortex-m3 diff --git a/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c b/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c index ae16061cd..c6c5aba34 100644 --- a/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c +++ b/mkrtos_user/lib/letter-shell/demo/mkrtos/shell_fs_ext.c @@ -8,6 +8,7 @@ #include #include #include +#include int ls(int argc, char *agrv[]) { DIR *dir; @@ -43,14 +44,13 @@ int cat(int argc, char *argv[]) if ((fp = fopen(argv[1], "r")) == NULL) { - return (-2); + return errno; } while ((c = fgetc(fp)) != EOF) { cons_write(&c, 1); } - cons_write_str("\n"); fclose(fp); return 0; diff --git a/mkrtos_user/lib/mlibc/src/mq/mq_close.c b/mkrtos_user/lib/mlibc/src/mq/mq_close.c index a61f094d4..b3cd702ad 100644 --- a/mkrtos_user/lib/mlibc/src/mq/mq_close.c +++ b/mkrtos_user/lib/mlibc/src/mq/mq_close.c @@ -1,7 +1,13 @@ #include #include "syscall.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif int mq_close(mqd_t mqd) { +#ifdef NO_LITTLE_MODE return syscall(SYS_close, mqd); +#else + return be_close(mqd); +#endif } diff --git a/mkrtos_user/lib/mlibc/src/network/netlink.c b/mkrtos_user/lib/mlibc/src/network/netlink.c index 94dba7f5c..77d93d462 100644 --- a/mkrtos_user/lib/mlibc/src/network/netlink.c +++ b/mkrtos_user/lib/mlibc/src/network/netlink.c @@ -38,7 +38,9 @@ static int __netlink_enumerate(int fd, unsigned int seq, int type, int af, } } } - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif int __rtnetlink_enumerate(int link_af, int addr_af, int (*cb)(void *ctx, struct nlmsghdr *h), void *ctx) { int fd, r; @@ -47,6 +49,10 @@ int __rtnetlink_enumerate(int link_af, int addr_af, int (*cb)(void *ctx, struct if (fd < 0) return -1; r = __netlink_enumerate(fd, 1, RTM_GETLINK, link_af, cb, ctx); if (!r) r = __netlink_enumerate(fd, 2, RTM_GETADDR, addr_af, cb, ctx); + #ifdef NO_LITTLE_MODE __syscall(SYS_close,fd); + #else + be_close(fd); + #endif return r; } diff --git a/mkrtos_user/lib/mlibc/src/stdio/__stdio_close.c b/mkrtos_user/lib/mlibc/src/stdio/__stdio_close.c index 302913285..5b30057fa 100644 --- a/mkrtos_user/lib/mlibc/src/stdio/__stdio_close.c +++ b/mkrtos_user/lib/mlibc/src/stdio/__stdio_close.c @@ -1,6 +1,8 @@ #include "stdio_impl.h" #include "aio_impl.h" - +#ifndef NO_LITTLE_MODE +#include "syscall_backend.h" +#endif static int dummy(int fd) { return fd; @@ -10,5 +12,9 @@ weak_alias(dummy, __aio_close); int __stdio_close(FILE *f) { +#ifdef NO_LITTLE_MODE return syscall(SYS_close, __aio_close(f->fd)); +#else + return be_close(__aio_close(f->fd)); +#endif } diff --git a/mkrtos_user/lib/sys_svr/inc/ns_types.h b/mkrtos_user/lib/sys_svr/inc/ns_types.h index efc5eaa51..4fa79e0bd 100644 --- a/mkrtos_user/lib/sys_svr/inc/ns_types.h +++ b/mkrtos_user/lib/sys_svr/inc/ns_types.h @@ -7,9 +7,9 @@ enum node_type { - MOUNT_NODE, - FILE_NODE, - DIR_NODE, + MOUNT_NODE, //!< 挂载节点 + FILE_NODE, //!< 文件节点 + DIR_NODE, //!< 存在子目录 }; typedef struct ns_node { @@ -18,7 +18,11 @@ typedef struct ns_node enum node_type type; union { - obj_handler_t node_hd; + struct + { + obj_handler_t node_hd; + pid_t pid; + }; slist_head_t sub_dir; }; slist_head_t node; @@ -29,5 +33,5 @@ typedef struct ns { rpc_svr_obj_t svr; ns_node_t root_node; - obj_handler_t hd; //!< 存储临时用于映射的hd + obj_handler_t hd; //!< 存储临时用于映射的hd } ns_t; \ No newline at end of file diff --git a/mkrtos_user/lib/sys_svr/inc/pm_svr.h b/mkrtos_user/lib/sys_svr/inc/pm_svr.h index 79242b7e0..624fdeb18 100644 --- a/mkrtos_user/lib/sys_svr/inc/pm_svr.h +++ b/mkrtos_user/lib/sys_svr/inc/pm_svr.h @@ -21,3 +21,4 @@ typedef struct pm void pm_svr_obj_init(pm_t *pm); int pm_rpc_run_app(const char *path, int flags); +int pm_rpc_kill_task(int pid, int flags); diff --git a/mkrtos_user/lib/sys_svr/inc/rpc_prot.h b/mkrtos_user/lib/sys_svr/inc/rpc_prot.h index 4341f78c4..42292354e 100644 --- a/mkrtos_user/lib/sys_svr/inc/rpc_prot.h +++ b/mkrtos_user/lib/sys_svr/inc/rpc_prot.h @@ -34,8 +34,9 @@ #define META_PROT 0x0004 //!< 元协议 -#define PM_PROT 0x0005 //!< 进程管理协议 -#define PM_RUN_APP ((uint16_t)0) //!< 启动应用程序 +#define PM_PROT 0x0005 //!< 进程管理协议 +#define PM_RUN_APP ((uint16_t)0) //!< 启动应用程序 +#define PM_KILL_TASK ((uint16_t)1) //!< 删除进程 #define CONS_PROT 0x0006 #define CONS_WRITE ((uint16_t)0) diff --git a/mkrtos_user/lib/sys_svr/src/pm_cli.c b/mkrtos_user/lib/sys_svr/src/pm_cli.c index 8e388ec03..500c0feb7 100644 --- a/mkrtos_user/lib/sys_svr/src/pm_cli.c +++ b/mkrtos_user/lib/sys_svr/src/pm_cli.c @@ -13,7 +13,6 @@ RPC_GENERATION_CALL2(pm_t, PM_PROT, PM_RUN_APP, run_app, rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, path, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags) - int pm_run_app(const char *path, int flags) { rpc_ref_array_uint32_t_uint8_t_32_t rpc_path = { @@ -27,3 +26,19 @@ int pm_run_app(const char *path, int flags) return msg_tag_get_val(tag); } + +RPC_GENERATION_CALL2(pm_t, PM_PROT, PM_KILL_TASK, kill_task, + rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, pid, + rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags) +int pm_kill_task(int pid, int flags) +{ + rpc_int_t rpc_pid = { + .data = pid, + }; + rpc_int_t rpc_flags = { + .data = flags, + }; + msg_tag_t tag = pm_t_kill_task_call(u_get_global_env()->ns_hd, &rpc_pid, &rpc_flags); + + return msg_tag_get_val(tag); +} diff --git a/mkrtos_user/lib/sys_svr/src/pm_svr.c b/mkrtos_user/lib/sys_svr/src/pm_svr.c index caf97a17a..5e93f701c 100644 --- a/mkrtos_user/lib/sys_svr/src/pm_svr.c +++ b/mkrtos_user/lib/sys_svr/src/pm_svr.c @@ -1,12 +1,12 @@ /** * @file pm_svr.c * @author ATShining (1358745329@qq.com) - * @brief + * @brief * @version 0.1 * @date 2023-11-28 - * + * * @copyright Copyright (c) 2023 - * + * */ #include "rpc_prot.h" #include "u_rpc.h" @@ -31,9 +31,21 @@ RPC_GENERATION_OP2(pm_t, PM_PROT, PM_RUN_APP, run_app, RPC_GENERATION_DISPATCH2(pm_t, PM_PROT, PM_RUN_APP, run_app, rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_IN, RPC_TYPE_DATA, path, rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags) +/*kill_task*/ +RPC_GENERATION_OP2(pm_t, PM_PROT, PM_KILL_TASK, kill_task, + rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, pid, + rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags) +{ + int16_t ret = 0; + ret = pm_rpc_kill_task(pid->data, flags->data); + return ret; +} +RPC_GENERATION_DISPATCH2(pm_t, PM_PROT, PM_KILL_TASK, kill_task, + rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, pid, + rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags) /*dispatch*/ -RPC_DISPATCH1(pm_t, PM_PROT, typeof(PM_RUN_APP), FS_OPEN, run_app) +RPC_DISPATCH2(pm_t, PM_PROT, typeof(PM_RUN_APP), PM_RUN_APP, run_app, PM_KILL_TASK, kill_task) void pm_svr_obj_init(pm_t *pm) { diff --git a/mkrtos_user/lib/sys_util/src/u_app_loader.c b/mkrtos_user/lib/sys_util/src/u_app_loader.c index c380fef70..12f1f0ad9 100644 --- a/mkrtos_user/lib/sys_util/src/u_app_loader.c +++ b/mkrtos_user/lib/sys_util/src/u_app_loader.c @@ -162,26 +162,27 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar buf = (umword_t *)app_stack_push(buf, 1 + arg_cn); //!< argc 24 buf = (umword_t *)app_stack_push(buf, (umword_t)usp_top + ARG_WORD_NR * 4); //!< argv[0] buf = (umword_t *)app_stack_push(buf, 0); //!< NULL - buf = (umword_t *)app_stack_push(buf, (umword_t)usp_top + ARG_WORD_NR * 4 + 32); //!< env[0...N] + buf = (umword_t *)app_stack_push(buf, (umword_t)usp_top + ARG_WORD_NR * 4 + 16); //!< env[0...N] buf = (umword_t *)app_stack_push(buf, 0); //!< NULL buf = (umword_t *)app_stack_push(buf, (umword_t)AT_PAGESZ); //!< auxvt[0...N] buf = (umword_t *)app_stack_push(buf, MK_PAGE_SIZE); //!< auxvt[0...N] buf = (umword_t *)app_stack_push(buf, 0xfe); //!< auxvt[0...N] mkrtos_env - buf = (umword_t *)app_stack_push(buf, (umword_t)usp_top + ARG_WORD_NR * 4 + 32 + 16); //!< auxvt[0...N] + buf = (umword_t *)app_stack_push(buf, (umword_t)usp_top + ARG_WORD_NR * 4 + 16 + 16); //!< auxvt[0...N] buf = (umword_t *)app_stack_push(buf, 0); //!< NULL // set args & env. memcpy((char *)buf_bk + ARG_WORD_NR * 4, name, strlen(name) + 1); - memcpy((char *)buf_bk + ARG_WORD_NR * 4 + 32, "PATH=/", strlen("PATH=/") + 1); + memcpy((char *)buf_bk + ARG_WORD_NR * 4 + 16, "PATH=/", strlen("PATH=/") + 1); // set user env. 16 bytes - uenv_t *uenv = (uenv_t *)((char *)buf_bk + ARG_WORD_NR * 4 + 32 + 16); + uenv_t *uenv = (uenv_t *)((char *)buf_bk + ARG_WORD_NR * 4 + 16 + 16); uenv->log_hd = cur_env->ns_hd; uenv->ns_hd = cur_env->ns_hd; uenv->rev1 = HANDLER_INVALID; uenv->rev2 = HANDLER_INVALID; + printf("stack env:%p, env:%p\n", (void *)((umword_t)usp_top + ARG_WORD_NR * 4 + 16 + 16), uenv); tag = thread_exec_regs(hd_thread, (umword_t)addr, (umword_t)sp_addr_top - sizeof(void *), ram_base, 1); assert(msg_tag_get_prot(tag) >= 0); diff --git a/mkrtos_user/lib/sys_util/src/u_rpc_svr.c b/mkrtos_user/lib/sys_util/src/u_rpc_svr.c index 2eeb329b8..c52f3de9c 100644 --- a/mkrtos_user/lib/sys_util/src/u_rpc_svr.c +++ b/mkrtos_user/lib/sys_util/src/u_rpc_svr.c @@ -78,6 +78,7 @@ static msg_tag_t rpc_meta_t_dispatch(struct rpc_svr_obj *obj, msg_tag_t in_tag, if (msg_tag_get_prot(in_tag) == META_PROT) { + printf("unknow prot.\n"); return msg_tag_init4(0, 0, 0, -EPROTO); } else @@ -87,10 +88,13 @@ static msg_tag_t rpc_meta_t_dispatch(struct rpc_svr_obj *obj, msg_tag_t in_tag, if (svr_obj == NULL) { + printf("unknow prot.\n"); + return msg_tag_init4(0, 0, 0, -EPROTO); } if (svr_obj->dispatch == NULL) { + printf("unknow dispatch.\n"); return msg_tag_init4(0, 0, 0, -EPROTO); } msg = svr_obj->dispatch(svr_obj, in_tag, ipc_msg); diff --git a/mkrtos_user/lib/util/inc/u_slist.h b/mkrtos_user/lib/util/inc/u_slist.h index dcaf6525f..bdce6fbef 100755 --- a/mkrtos_user/lib/util/inc/u_slist.h +++ b/mkrtos_user/lib/util/inc/u_slist.h @@ -34,13 +34,16 @@ static inline mword_t slist_is_empty(slist_head_t *list) */ static inline bool_t slist_in_list(slist_head_t *item) { - if (slist_is_empty(item)) { + if (slist_is_empty(item)) + { return FALSE; } - if (item->prev->next != item) { + if (item->prev->next != item) + { return FALSE; } - if (item->next->prev != item) { + if (item->next->prev != item) + { return FALSE; } return TRUE; @@ -60,9 +63,9 @@ static inline void slist_add(slist_head_t *head, slist_head_t *item) } static inline void slist_add_append(slist_head_t *head, slist_head_t *item) { - slist_head_t *tail = head->prev; + slist_head_t *tail = head->prev; - return slist_add(tail, item); + return slist_add(tail, item); } /** * @brief 获取第一个节点 @@ -96,3 +99,10 @@ static inline void slist_del(slist_head_t *item) */ #define slist_foreach(pos, head, member) \ for (pos = slist_entry((head)->next, typeof(*pos), member); &(pos)->member != (head) && !slist_is_empty(head); pos = slist_entry((pos)->member.next, typeof(*pos), member)) + +#define slist_foreach_not_next(pos, head, member) \ + for (pos = slist_entry((head)->next, typeof(*pos), member); \ + &(pos)->member != (head) && !slist_is_empty(head);) + +#define slist_next_entry(pos, head, member) \ + slist_entry((pos)->member.next, typeof(*pos), member) diff --git a/mkrtos_user/server/CMakeLists.txt b/mkrtos_user/server/CMakeLists.txt index 706d3b60d..45c1ced83 100644 --- a/mkrtos_user/server/CMakeLists.txt +++ b/mkrtos_user/server/CMakeLists.txt @@ -14,9 +14,9 @@ include_directories( add_subdirectory(init) add_subdirectory(shell) -add_subdirectory(app) +# add_subdirectory(app) add_subdirectory(fs) -add_subdirectory(hello) +# add_subdirectory(hello) add_subdirectory(drv) add_subdirectory(test) # add_subdirectory(tcc-0.9.27) diff --git a/mkrtos_user/server/fs/CMakeLists.txt b/mkrtos_user/server/fs/CMakeLists.txt index 93ad1b8d0..0c524b796 100644 --- a/mkrtos_user/server/fs/CMakeLists.txt +++ b/mkrtos_user/server/fs/CMakeLists.txt @@ -2,3 +2,4 @@ cmake_minimum_required(VERSION 3.13) add_subdirectory(fatfs) +add_subdirectory(cpiofs) diff --git a/mkrtos_user/server/fs/cpiofs/CMakeLists.txt b/mkrtos_user/server/fs/cpiofs/CMakeLists.txt new file mode 100644 index 000000000..aea61abb7 --- /dev/null +++ b/mkrtos_user/server/fs/cpiofs/CMakeLists.txt @@ -0,0 +1,81 @@ +cmake_minimum_required(VERSION 3.13) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_STDPERIPH_DRIVER=1 -DSTM32F10X_XL ") + +file( + GLOB deps + *.c +) + +# list(REMOVE_ITEM deps mkrtos_user/server/fs/cpiofs/ram_disk_drv/*.*) + +add_executable( + cpiofs.elf + ${deps} +) +target_link_libraries( + cpiofs.elf + PUBLIC + start + muslc + sys + sys_util + sys_svr + stm32f1_bsp + ${GCC_LIB_PATH}/libgcc.a +) +target_include_directories( + cpiofs.elf + PUBLIC + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/cpio + + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/ + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/src/internal + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/include + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/internal + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/include + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/include + + ${CMAKE_SOURCE_DIR}/mkrtos_user/server/fs/cpiofs/ff15/source + ${CMAKE_SOURCE_DIR}/mkrtos_user/server/fs/cpiofs + + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/stm32f1_bsp/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/stm32f1_bsp/core_inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/server/fs/cpiofs/ext_disk_drv +) +add_dependencies( + cpiofs.elf + start + muslc + sys + sys_util + stm32f1_bsp +) +set_target_properties( + cpiofs.elf PROPERTIES LINK_FLAGS + "-T ${CMAKE_CURRENT_LIST_DIR}/link.lds -pie --gc-section -no-dynamic-linker " + #--no-warn-rwx-segments +) +add_custom_target( + cpiofs_dump ALL + COMMAND + ${CMAKE_OBJDUMP} -s -S cpiofs.elf > ${CMAKE_SOURCE_DIR}/build/output/cpiofs.S + COMMAND + ${CMAKE_READELF} -a cpiofs.elf > ${CMAKE_SOURCE_DIR}/build/output/cpiofs.txt + COMMAND + ${CMAKE_OBJCOPY} -O binary -S cpiofs.elf cpiofs.bin + COMMAND + ${CMAKE_SIZE} cpiofs.elf + COMMAND + mkdir -p ${CMAKE_SOURCE_DIR}/build/output/cpio + COMMAND + cp cpiofs.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/cpiofs + COMMAND + cp cpiofs.elf ${CMAKE_SOURCE_DIR}/build/output/cpiofs.elf +) + +add_dependencies(cpiofs_dump cpiofs.elf) + \ No newline at end of file diff --git a/mkrtos_user/server/fs/cpiofs/fs_rpc.c b/mkrtos_user/server/fs/cpiofs/fs_rpc.c new file mode 100644 index 000000000..503ccc3ed --- /dev/null +++ b/mkrtos_user/server/fs/cpiofs/fs_rpc.c @@ -0,0 +1,234 @@ +#include "u_rpc.h" +#include "u_rpc_svr.h" +#include "u_sys.h" +#include "fs_svr.h" +#include "cons_cli.h" +#include "u_log.h" +#include "u_env.h" +#include +#include +#include +#include +#include +#include "rpc_prot.h" +#include "cpiofs.h" +static fs_t fs; + +typedef struct file_desc +{ + pid_t pid; + addr_t file_addr; + size_t file_size; + ssize_t offset; +} file_desc_t; + +#define CPIO_FS_FD_NR 8 +static file_desc_t fds[CPIO_FS_FD_NR]; + +static file_desc_t *fd_alloc(addr_t file_addr, size_t file_size, ssize_t offset, int *fd) +{ + for (int i = 0; i < CPIO_FS_FD_NR; i++) + { + if (fds[i].file_addr == 0) + { + fds[i].pid = thread_get_src_pid(); + fds[i].file_addr = file_addr; + fds[i].file_size = file_size; + fds[i].offset = offset; + if (fd) + { + *fd = i; + } + return fds + i; + } + } + return NULL; +} +static file_desc_t *fd_get(int fd) +{ + if (fd < 0 || fd >= CPIO_FS_FD_NR) + { + return NULL; + } + if (fds[fd].file_addr == 0) + { + return NULL; + } + if (fds[fd].pid != thread_get_src_pid()) + { + return NULL; + } + return &fds[fd]; +} +static void fd_free(int fd) +{ + if (fd < 0 || fd >= CPIO_FS_FD_NR) + { + return; + } + if (fds[fd].file_addr) + { + if (fds[fd].pid == thread_get_src_pid()) + { + fds[fd].file_addr = 0; + fds[fd].pid = -1; + } + } +} + +void fs_svr_init(void) +{ + fs_init(&fs); + meta_reg_svr_obj(&fs.svr, FS_PROT); +} +int fs_svr_open(const char *path, int flags, int mode) +{ + msg_tag_t tag; + sys_info_t sys_info; + + if (flags & O_RDWR) + { + return -EACCES; + } + if (flags & O_WRONLY) + { + return -EACCES; + } + if (path[0]=='/') { + path++; + } + + tag = sys_read_info(SYS_PROT, &sys_info); + if (msg_tag_get_val(tag) < 0) + { + return -ENOENT; + } + umword_t size; + umword_t addr = cpio_find_file((umword_t)sys_info.bootfs_start_addr, (umword_t)(-1), path, &size); + if (!addr) + { + return -ENOENT; + } + int fd; + // 找到指定文件 + file_desc_t *fdp = fd_alloc(addr, size, 0, &fd); + + if (!fdp) + { + return -ENOMEM; + } + + return fd; +} + +int fs_svr_read(int fd, void *buf, size_t len) +{ + file_desc_t *fdp = fd_get(fd); + + if (!fdp) + { + return -ENOENT; + } + size_t remain_size = fdp->file_size - fdp->offset; + size_t read_size = 0; + + read_size = MIN(remain_size, len); + if (read_size) + { + memcpy(buf, (void *)(fdp->file_addr + fdp->offset), read_size); + fdp->offset += read_size; + } + return read_size; +} +int fs_svr_write(int fd, void *buf, size_t len) +{ + file_desc_t *fdp = fd_get(fd); + + if (!fdp) + { + return -ENOENT; + } + return -EACCES; +} +void fs_svr_close(int fd) +{ + fd_free(fd); +} +int fs_svr_lseek(int fd, int offs, int whence) +{ + file_desc_t *file = fd_get(fd); + int new_offs = 0; + + if (!file) + { + return -ENOENT; + } + switch (whence) + { + case SEEK_SET: + new_offs = offs; + break; + case SEEK_END: + { + new_offs = file->file_size + offs; + } + break; + case SEEK_CUR: + { + new_offs = offs + file->offset; + } + break; + default: + return -EINVAL; + } + if (new_offs > file->file_size) + { + new_offs = file->file_size; + } + if (new_offs < 0) + { + new_offs = 0; + } + file->offset = new_offs; + + return 0; +} +int fs_svr_ftruncate(int fd, off_t off) +{ + return -ENOSYS; +} +void fs_svr_sync(int fd) +{ +} +int fs_svr_readdir(int fd, dirent_t *dir) +{ + return -ENOSYS; +} +int fs_svr_mkdir(char *path) +{ + return -ENOSYS; +} +int fs_svr_unlink(char *path) +{ + return -ENOSYS; +} +int fs_svr_renmae(char *oldname, char *newname) +{ + return -ENOSYS; +} +int fs_svr_fstat(int fd, stat_t *stat) +{ + file_desc_t *file = fd_get(fd); + + if (!file) + { + return -ENOENT; + } + stat->st_size = file->file_size; + return 0; +} + +void fs_svr_loop(void) +{ + rpc_loop(); +} \ No newline at end of file diff --git a/mkrtos_user/server/fs/cpiofs/fs_rpc.h b/mkrtos_user/server/fs/cpiofs/fs_rpc.h new file mode 100644 index 000000000..351c7b969 --- /dev/null +++ b/mkrtos_user/server/fs/cpiofs/fs_rpc.h @@ -0,0 +1,4 @@ +#pragma once + +void fs_svr_init(void); +void fs_svr_loop(void); diff --git a/mkrtos_user/server/fs/cpiofs/heap_stack.c b/mkrtos_user/server/fs/cpiofs/heap_stack.c new file mode 100644 index 000000000..dcc088c04 --- /dev/null +++ b/mkrtos_user/server/fs/cpiofs/heap_stack.c @@ -0,0 +1,17 @@ + +#define HEAP_SIZE 512 +#define STACK_SIZE 1024 * 2 + +#if defined(__CC_ARM) +#define HEAP_ATTR SECTION("HEAP") __attribute__((zero_init)) +#define STACK_ATTR SECTION("STACK") __attribute__((zero_init)) +#elif defined(__GNUC__) +#define HEAP_ATTR __attribute__((__section__(".bss.heap"))) +#define STACK_ATTR __attribute__((__section__(".bss.stack"))) +#elif defined(__IAR_SYSTEMS_ICC__) +#define HEAP_ATTR +#define STACK_ATTR +#endif + +__attribute__((used)) HEAP_ATTR static char heap[HEAP_SIZE]; +__attribute__((used)) STACK_ATTR static char stack[STACK_SIZE]; diff --git a/mkrtos_user/server/fs/cpiofs/link.lds b/mkrtos_user/server/fs/cpiofs/link.lds new file mode 100644 index 000000000..4c5c55b26 --- /dev/null +++ b/mkrtos_user/server/fs/cpiofs/link.lds @@ -0,0 +1,119 @@ +ENTRY(_start_) + +SECTIONS +{ + .text : { + . = ALIGN(4); + __text_start__ = .; + KEEP(*(.first)) + *(.text) + *(.text.*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(SORT(.rodata.*)) + *(.rodata) + + KEEP(*(.eh_frame*)) + + . = ALIGN(4); + __rel_start__ = .; + *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) + __rel_end__ = .; + } + .ARM.exidx : { + . = ALIGN(4); + __exdix_start = .; + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + /* This is used by the startup in order to initialize the .data secion */ + __exdix_end = .; + } + + .permissions_table : { + . = ALIGN(4); + __permissions_table_start__ = .; + KEEP(*(.permissions_table)) + __permissions_table_end__ = .; + } + + + PROVIDE(__ram_size__ = __bss_end__ - __data_start__); + .data : { + . = ALIGN(4); + __data_start__ = .; + __got_start__ = .; + *(.got) + __got_end__ = .; + . = ALIGN(4); + *(.data) + *(.data.*) + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + } + + PROVIDE(__heap_size__ = __heap_end__ - __heap_start__); + PROVIDE(__stack_size__ = __stack_end__ - __stack_start__); + .bss : { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + __bss_start__ = .; + *(.bss) + *(COMMON) + + . = ALIGN(4); + __heap_start__ = .; + KEEP(*(.bss.heap)) + __heap_end__ = .; + + . = ALIGN(4); + __stack_start__ = .; + KEEP(*(.bss.stack)) + __stack_end__ = .; + + *(.bss.*) + /* This is used by the startup in order to initialize the .bss secion */ + . = ALIGN(4); + __bss_end__ = .; + } + _end = .; +} diff --git a/mkrtos_user/server/fs/cpiofs/main.c b/mkrtos_user/server/fs/cpiofs/main.c new file mode 100644 index 000000000..a2513f45a --- /dev/null +++ b/mkrtos_user/server/fs/cpiofs/main.c @@ -0,0 +1,30 @@ + +#include +#include "u_log.h" +#include "ns_cli.h" +#include "u_rpc_svr.h" +#include "u_prot.h" +#include "u_env.h" +#include "u_drv.h" +#include "cons_cli.h" +#include "fs_rpc.h" +#include +#include +#include +int main(int argv, char *args[]) +{ + obj_handler_t hd; + int ret; + + printf("args[0]:%s\n", args[0]); + + ret = rpc_meta_init(THREAD_MAIN, &hd); + assert(ret >= 0); + fs_svr_init(); + ns_register("/cpio", hd, MOUNT_NODE); + cons_write_str("cpiofs mount success\n"); + *((char *)0) = 0; + + fs_svr_loop(); + return 0; +} diff --git a/mkrtos_user/server/fs/fatfs/main.c b/mkrtos_user/server/fs/fatfs/main.c index 7907c3d37..1f0f63198 100644 --- a/mkrtos_user/server/fs/fatfs/main.c +++ b/mkrtos_user/server/fs/fatfs/main.c @@ -44,7 +44,7 @@ int main(int args, char *argv[]) } } } - cons_write_str("mount success\n"); + cons_write_str("fatfs mount success\n"); fs_svr_loop(); return 0; diff --git a/mkrtos_user/server/init/src/namespace.c b/mkrtos_user/server/init/src/namespace.c index 374703de6..7012604bd 100644 --- a/mkrtos_user/server/init/src/namespace.c +++ b/mkrtos_user/server/init/src/namespace.c @@ -13,6 +13,7 @@ #include #include #include +#include "u_slist.h" #include "u_hd_man.h" #include "u_ipc.h" #include "ns_types.h" @@ -23,10 +24,38 @@ #include "file_desc.h" #include #include +#include static ns_t ns; static fs_t ns_fs; int ns_reg(const char *path, obj_handler_t hd, enum node_type type); +int ns_node_free(ns_node_t *node); +static void _ns_node_del_by_pid(slist_head_t *head, pid_t pid) +{ + ns_node_t *pos; + slist_foreach_not_next(pos, head, node) + { + ns_node_t *next = slist_next_entry(pos, head, node); + + if (pos->type != DIR_NODE) + { + if (pid == pos->pid) + { + ns_node_free(pos); + } + } + else + { + _ns_node_del_by_pid(&pos->sub_dir, pid); + } + + pos = next; + } +} +void ns_node_del_by_pid(pid_t pid) +{ + _ns_node_del_by_pid(&ns.root_node.sub_dir, pid); +} static ns_node_t *node_init(ns_node_t *new_node, ns_node_t *parent, const char *name, obj_handler_t hd, enum node_type type) { strncpy(new_node->node_name, name, sizeof(new_node->node_name)); @@ -34,6 +63,7 @@ static ns_node_t *node_init(ns_node_t *new_node, ns_node_t *parent, const char * new_node->ref = 1; new_node->type = type; new_node->parent = parent; + new_node->pid = thread_get_src_pid(); if (parent) { parent->ref++; //! 父目录的引用计数+1 @@ -464,7 +494,6 @@ void namespace_loop(void) rpc_loop(); } - int fs_svr_read(int fd, void *buf, size_t len) { return -ENOSYS; diff --git a/mkrtos_user/server/init/src/namespace.h b/mkrtos_user/server/init/src/namespace.h index a6fb4409c..81b613e20 100644 --- a/mkrtos_user/server/init/src/namespace.h +++ b/mkrtos_user/server/init/src/namespace.h @@ -11,6 +11,8 @@ #pragma once #include "u_types.h" #include "u_prot.h" +#include +#include enum ns_op { OP_REGISTER, @@ -21,3 +23,4 @@ int namespace_register(const char *path, obj_handler_t hd, int type); int namespace_query(const char *path, obj_handler_t *hd); int namespace_pre_alloc_map_fd(void); void namespace_loop(void); +void ns_node_del_by_pid(pid_t pid); diff --git a/mkrtos_user/server/init/src/pm.c b/mkrtos_user/server/init/src/pm.c index 6cd6e7062..6a61daa86 100644 --- a/mkrtos_user/server/init/src/pm.c +++ b/mkrtos_user/server/init/src/pm.c @@ -14,6 +14,7 @@ #include "rpc_prot.h" #include #include "cons_svr.h" +#include "namespace.h" static pm_t pm; void pm_init(void) @@ -23,6 +24,12 @@ void pm_init(void) printf("pm runing..\n"); } +int pm_rpc_kill_task(int pid, int flags) +{ + printf("[pm] kill pid:%d.\n", pid); + ns_node_del_by_pid(pid); + return 0; +} int pm_rpc_run_app(const char *path, int flags) { pid_t pid; diff --git a/mkrtos_user/server/test/src/main.c b/mkrtos_user/server/test/src/main.c index ee4471bfd..c63b26b35 100644 --- a/mkrtos_user/server/test/src/main.c +++ b/mkrtos_user/server/test/src/main.c @@ -18,6 +18,7 @@ int main(int argc, char *args[]) { printf("argc:%d args[0]:%s\n", argc, args[0]); + // *((char *)0) = 0; #if 0 malloc_test(); rpc_test(); diff --git a/mkrtos_user/server/tinycc-arm-thumb/CMakeLists.txt b/mkrtos_user/server/tinycc-arm-thumb/CMakeLists.txt index dd89f77d4..5e051cd53 100644 --- a/mkrtos_user/server/tinycc-arm-thumb/CMakeLists.txt +++ b/mkrtos_user/server/tinycc-arm-thumb/CMakeLists.txt @@ -33,10 +33,10 @@ file(GLOB deps # lib/libtcc1.c # lib/va_list.c ) -add_executable(tcc_armv7m.elf +add_executable(tcc.elf ${deps} ) -target_link_libraries(tcc_armv7m.elf +target_link_libraries(tcc.elf PUBLIC muslc --whole-archive @@ -49,16 +49,16 @@ target_link_libraries(tcc_armv7m.elf ${GCC_LIB_PATH}/libgcc.a ) target_include_directories( - tcc_armv7m.elf + tcc.elf PUBLIC ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_util/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc - ${CMAKE_SOURCE_DIR}/mkrtos_user/server/tcc_armv7m/src/test + ${CMAKE_SOURCE_DIR}/mkrtos_user/server/tcc/src/test ${CMAKE_SOURCE_DIR}/mkrtos_user/server/tinycc-arm-thumb ${CMAKE_SOURCE_DIR}/mkrtos_user/server/tinycc-arm-thumb/lib - # ${CMAKE_SOURCE_DIR}/mkrtos_user/server/tcc_armv7m-0.9.27/include + # ${CMAKE_SOURCE_DIR}/mkrtos_user/server/tcc-0.9.27/include ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/ ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic @@ -68,40 +68,40 @@ target_include_directories( ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/include ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/server/tcc_armv7m/bsp/core_inc - ${CMAKE_SOURCE_DIR}/mkrtos_user/server/tcc_armv7m/bsp/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/server/tcc/bsp/core_inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/server/tcc/bsp/inc ) -add_dependencies(tcc_armv7m.elf +add_dependencies(tcc.elf muslc ) -set_target_properties(tcc_armv7m.elf PROPERTIES LINK_FLAGS +set_target_properties(tcc.elf PROPERTIES LINK_FLAGS "-T ${CMAKE_CURRENT_LIST_DIR}/link.lds -pie --gc-section -no-dynamic-linker " #--no-warn-rwx-segments ) # add_custom_target( - tcc_armv7m_dump ALL + tcc_dump ALL COMMAND - ${CMAKE_OBJDUMP} -s -S tcc_armv7m.elf > ${CMAKE_SOURCE_DIR}/build/output/tcc_armv7m.S + ${CMAKE_OBJDUMP} -s -S tcc.elf > ${CMAKE_SOURCE_DIR}/build/output/tcc.S COMMAND - ${CMAKE_READELF} -a tcc_armv7m.elf > ${CMAKE_SOURCE_DIR}/build/output/tcc_armv7m.txt + ${CMAKE_READELF} -a tcc.elf > ${CMAKE_SOURCE_DIR}/build/output/tcc.txt COMMAND - ${CMAKE_OBJCOPY} -O binary -S tcc_armv7m.elf tcc_armv7m.bin + ${CMAKE_OBJCOPY} -O binary -S tcc.elf tcc.bin COMMAND - ${CMAKE_SIZE} tcc_armv7m.elf + ${CMAKE_SIZE} tcc.elf COMMAND mkdir -p ${CMAKE_SOURCE_DIR}/build/output/cpio COMMAND - cp tcc_armv7m.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/tcc_armv7m + cp tcc.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/tcc COMMAND - cp tcc_armv7m.elf ${CMAKE_SOURCE_DIR}/build/output/tcc_armv7m.elf + cp tcc.elf ${CMAKE_SOURCE_DIR}/build/output/tcc.elf ) -add_dependencies(tcc_armv7m_dump tcc_armv7m.elf) -add_dependencies(tcc_armv7m_dump sys) -add_dependencies(tcc_armv7m_dump sys_util) -add_dependencies(tcc_armv7m_dump mr) -add_dependencies(tcc_armv7m_dump sys_svr) -add_dependencies(tcc_armv7m_dump start) -add_dependencies(tcc_armv7m_dump muslc) +add_dependencies(tcc_dump tcc.elf) +add_dependencies(tcc_dump sys) +add_dependencies(tcc_dump sys_util) +add_dependencies(tcc_dump mr) +add_dependencies(tcc_dump sys_svr) +add_dependencies(tcc_dump start) +add_dependencies(tcc_dump muslc) \ No newline at end of file