From d38f82b04230653bcba62f495aa1a9bf657fcd34 Mon Sep 17 00:00:00 2001 From: zhangzheng <1358745329@qq.com> Date: Sun, 10 Dec 2023 10:20:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81kill=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 +- mkrtos_knl/knl/task.c | 11 ++-- mkrtos_script/build.sh | 2 +- .../letter-shell/demo/mkrtos/shell_fs_ext.c | 15 +++++- mkrtos_user/lib/sys/inc/u_prot.h | 14 +++++ mkrtos_user/lib/sys/inc/u_task.h | 2 +- mkrtos_user/lib/sys/src/u_task.c | 10 ++-- mkrtos_user/lib/sys_svr/inc/pm_cli.h | 2 + mkrtos_user/lib/sys_util/src/u_app_loader.c | 3 +- mkrtos_user/lib/sys_util/src/u_rpc_buf.c | 53 ++++++++++++------- mkrtos_user/server/init/src/pm.c | 25 ++++++++- 11 files changed, 107 insertions(+), 33 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 48c492347..d3bce78f6 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -271,7 +271,8 @@ "u_slist.h": "c", "atomic": "c", "futex.h": "c", - "u_rpc_buf.h": "c" + "u_rpc_buf.h": "c", + "pm_cli.h": "c" }, "cortex-debug.showRTOS": false, "cortex-debug.variableUseNaturalFormat": false, diff --git a/mkrtos_knl/knl/task.c b/mkrtos_knl/knl/task.c index d6be9673d..4db43874e 100755 --- a/mkrtos_knl/knl/task.c +++ b/mkrtos_knl/knl/task.c @@ -198,11 +198,12 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i tag = msg_tag_init4(0, 0, 0, 0); break; } + f->r[1] = source_kobj->kobj_type; spinlock_set(&tag_task->kobj.lock, status); tag = msg_tag_init4(0, 0, 0, 1); } break; - case TASK_OBJ_MAP://!<从一个task中映射一个对象到目标进程 + case TASK_OBJ_MAP: //!< 从一个task中映射一个对象到目标进程 { kobj_del_list_t del; int st0, st1; @@ -222,7 +223,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://!<解除task中一个进程的创建 + case TASK_OBJ_UNMAP: //!< 解除task中一个进程的创建 { kobject_t *del_kobj; kobj_del_list_t kobj_list; @@ -240,7 +241,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, 0); } break; - case TASK_ALLOC_RAM_BASE://!< 分配task所拥有的内存空间 + case TASK_ALLOC_RAM_BASE: //!< 分配task所拥有的内存空间 { mword_t status = spinlock_lock(&tag_task->kobj.lock); if (status < 0) @@ -254,12 +255,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://!<设置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://!<获取pid + case TASK_GET_PID: //!< 获取pid { f->r[1] = tag_task->pid; tag = msg_tag_init4(0, 0, 0, 0); diff --git a/mkrtos_script/build.sh b/mkrtos_script/build.sh index c70e3ecde..3fc62f42e 100755 --- a/mkrtos_script/build.sh +++ b/mkrtos_script/build.sh @@ -6,7 +6,7 @@ export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/ export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp export KEN_OFFSET=0x2000 export INIT_OFFSET=0x10000 -export BOOTFS_ADDR_OFFSET=0x20000 +export BOOTFS_ADDR_OFFSET=0x21000 export KNL_DATA=0x20000000 export KNL_DATA_SIZE=32M export BOARD=STM32F2x 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 c6c5aba34..672ca054c 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 @@ -1,6 +1,7 @@ #include "shell.h" #include "cons_cli.h" - +#include "pm_cli.h" +#include #include #include #include @@ -57,3 +58,15 @@ int cat(int argc, char *argv[]) } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), cat, cat, cat command); +int kill(int argc, char *argv[]) +{ + if (argc < 2) + { + return -1; + } + int pid = atoi(argv[1]); + + pm_kill_task(pid, PM_KILL_TASK_ALL); + return 0; +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), kill, kill, kill command); \ No newline at end of file diff --git a/mkrtos_user/lib/sys/inc/u_prot.h b/mkrtos_user/lib/sys/inc/u_prot.h index bc5846003..573ddfc30 100644 --- a/mkrtos_user/lib/sys/inc/u_prot.h +++ b/mkrtos_user/lib/sys/inc/u_prot.h @@ -96,3 +96,17 @@ static inline vpage_t vpage_create_raw3(umword_t attrs, umword_t flags, umword_t { return (vpage_t){.attrs = attrs, .flags = flags, .addr = addr}; } + +enum knl_obj_type +{ + BASE_KOBJ_TYPE, + TASK_TYPE, + THREAD_TYPE, + IRQ_SENDER_TYPE, + IPC_TYPE, + LOG_TYPE, + MM_TYPE, + FACTORY_TYPE, + SYS_TYPE, + FUTEX_TYPE, +}; diff --git a/mkrtos_user/lib/sys/inc/u_task.h b/mkrtos_user/lib/sys/inc/u_task.h index 2bde5f2c5..2af85f13d 100644 --- a/mkrtos_user/lib/sys/inc/u_task.h +++ b/mkrtos_user/lib/sys/inc/u_task.h @@ -9,7 +9,7 @@ enum obj_attrs }; msg_tag_t task_set_pid(obj_handler_t dst_task, umword_t pid); msg_tag_t task_get_pid(obj_handler_t dst_task, umword_t *data); -msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx); +msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx, int *obj_type); msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t dst_obj, uint8_t attrs); msg_tag_t task_unmap(obj_handler_t task_han, vpage_t vpage); msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *alloc_addr); diff --git a/mkrtos_user/lib/sys/src/u_task.c b/mkrtos_user/lib/sys/src/u_task.c index eb343e10d..d40da8210 100644 --- a/mkrtos_user/lib/sys/src/u_task.c +++ b/mkrtos_user/lib/sys/src/u_task.c @@ -53,9 +53,10 @@ msg_tag_t task_get_pid(obj_handler_t dst_task, umword_t *pid) return msg_tag_init(r0); } -msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx) +msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx, int *obj_type) { register volatile umword_t r0 asm("r0"); + register volatile umword_t r1 asm("r1"); mk_syscall(syscall_prot_create(TASK_OBJ_VALID, TASK_PROT, dst_task).raw, 0, @@ -68,9 +69,12 @@ msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx) : : : "r0"); - msg_tag_t tag = msg_tag_init(r0); + if (obj_type) + { + *obj_type = r1; + } - return tag; + return msg_tag_init(r0); } msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t dst_obj, uint8_t attrs) diff --git a/mkrtos_user/lib/sys_svr/inc/pm_cli.h b/mkrtos_user/lib/sys_svr/inc/pm_cli.h index 964b62dde..46444ed44 100644 --- a/mkrtos_user/lib/sys_svr/inc/pm_cli.h +++ b/mkrtos_user/lib/sys_svr/inc/pm_cli.h @@ -1,4 +1,6 @@ #pragma once +#define PM_KILL_TASK_ALL 0x1 + int pm_run_app(const char *path, int flags); int pm_kill_task(int pid, int flags); 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 6ac707ffc..2fdfa0812 100644 --- a/mkrtos_user/lib/sys_util/src/u_app_loader.c +++ b/mkrtos_user/lib/sys_util/src/u_app_loader.c @@ -182,7 +182,8 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar 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); + printf("pid:%d, stack env:%p, env:%p\n", hd_task, + (void *)((umword_t)usp_top + ARG_WORD_NR * 4 + 16 + 16), uenv); tag = thread_exec_regs(hd_thread, (umword_t)addr, ((umword_t)((umword_t)sp_addr_top - 8) & ~0x7UL), ram_base, 1); diff --git a/mkrtos_user/lib/sys_util/src/u_rpc_buf.c b/mkrtos_user/lib/sys_util/src/u_rpc_buf.c index 76b028c7a..ddfddbc44 100644 --- a/mkrtos_user/lib/sys_util/src/u_rpc_buf.c +++ b/mkrtos_user/lib/sys_util/src/u_rpc_buf.c @@ -4,11 +4,22 @@ #include "u_prot.h" #include "u_task.h" #include "u_thread.h" -static obj_handler_t buf_hd = HANDLER_INVALID; +#include "u_util.h" +#include +#define RPC_SVR_MAP_OBJ_NR 4 +static obj_handler_t buf_hd[RPC_SVR_MAP_OBJ_NR]; + +AUTO_CALL(101) void rpc_hd_init(void) +{ + for (int i = 0; i < RPC_SVR_MAP_OBJ_NR; i++) + { + buf_hd[i] = HANDLER_INVALID; + } +} obj_handler_t rpc_hd_get(int inx) { - /*TODO:*/ - return buf_hd; + assert(inx < RPC_SVR_MAP_OBJ_NR && inx >= 0); + return buf_hd[inx]; } int rpc_hd_alloc(void) { @@ -17,27 +28,31 @@ int rpc_hd_alloc(void) obj_handler_t hd; bool_t alloc_new = TRUE; - if (handler_is_used(buf_hd)) + for (int i = 0; i < RPC_SVR_MAP_OBJ_NR; i++) { - if (task_obj_valid(TASK_THIS, buf_hd).prot == 0) + obj_handler_t tmp_hd = buf_hd[i]; + if (handler_is_used(tmp_hd)) { - alloc_new = FALSE; + if (task_obj_valid(TASK_THIS, tmp_hd, 0).prot == 0) + { + alloc_new = FALSE; + } } - } - if (alloc_new) - { - hd = handler_alloc(); - if (hd == HANDLER_INVALID) + if (alloc_new) { - return -1; + hd = handler_alloc(); + if (hd == HANDLER_INVALID) + { + return -1; + } } + else + { + hd = tmp_hd; + } + thread_msg_buf_get(-1, (umword_t *)(&msg), NULL); + msg->map_buf[i] = vpage_create_raw3(0, 0, hd).raw; + buf_hd[i] = hd; } - else - { - hd = buf_hd; - } - thread_msg_buf_get(-1, (umword_t *)(&msg), NULL); - msg->map_buf[0] = vpage_create_raw3(0, 0, hd).raw; - buf_hd = hd; return 0; } diff --git a/mkrtos_user/server/init/src/pm.c b/mkrtos_user/server/init/src/pm.c index 0e82f58d2..2988b90f4 100644 --- a/mkrtos_user/server/init/src/pm.c +++ b/mkrtos_user/server/init/src/pm.c @@ -15,6 +15,8 @@ #include #include "cons_svr.h" #include "namespace.h" +#include "u_task.h" +#include static pm_t pm; void pm_init(void) @@ -23,11 +25,32 @@ void pm_init(void) meta_reg_svr_obj(&pm.svr_obj, PM_PROT); printf("pm runing..\n"); } - int pm_rpc_kill_task(int pid, int flags) { + int obj_type; + msg_tag_t tag; + + if (pid == TASK_THIS) + { + return -EINVAL; + } + + tag = task_obj_valid(TASK_THIS, pid, &obj_type); + if (msg_tag_get_val(tag) < 0) + { + return msg_tag_get_val(tag); + } + if (msg_tag_get_val(tag) == 0) + { + return -1; + } + if (obj_type != TASK_TYPE) + { + return -1; + } printf("[pm] kill pid:%d.\n", pid); ns_node_del_by_pid(pid, flags); + task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, pid)); return 0; } int pm_rpc_run_app(const char *path, int flags)