支持kill命令

This commit is contained in:
zhangzheng
2023-12-10 10:20:05 +08:00
parent 796883fb98
commit d38f82b042
11 changed files with 107 additions and 33 deletions

View File

@@ -271,7 +271,8 @@
"u_slist.h": "c", "u_slist.h": "c",
"atomic": "c", "atomic": "c",
"futex.h": "c", "futex.h": "c",
"u_rpc_buf.h": "c" "u_rpc_buf.h": "c",
"pm_cli.h": "c"
}, },
"cortex-debug.showRTOS": false, "cortex-debug.showRTOS": false,
"cortex-debug.variableUseNaturalFormat": false, "cortex-debug.variableUseNaturalFormat": false,

View File

@@ -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); tag = msg_tag_init4(0, 0, 0, 0);
break; break;
} }
f->r[1] = source_kobj->kobj_type;
spinlock_set(&tag_task->kobj.lock, status); spinlock_set(&tag_task->kobj.lock, status);
tag = msg_tag_init4(0, 0, 0, 1); tag = msg_tag_init4(0, 0, 0, 1);
} }
break; break;
case TASK_OBJ_MAP://!<从一个task中映射一个对象到目标进程 case TASK_OBJ_MAP: //!< 从一个task中映射一个对象到目标进程
{ {
kobj_del_list_t del; kobj_del_list_t del;
int st0, st1; 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); tag = msg_tag_init4(0, 0, 0, ret);
} }
break; break;
case TASK_OBJ_UNMAP://!<解除task中一个进程的创建 case TASK_OBJ_UNMAP: //!< 解除task中一个进程的创建
{ {
kobject_t *del_kobj; kobject_t *del_kobj;
kobj_del_list_t kobj_list; 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); tag = msg_tag_init4(0, 0, 0, 0);
} }
break; break;
case TASK_ALLOC_RAM_BASE://!< 分配task所拥有的内存空间 case TASK_ALLOC_RAM_BASE: //!< 分配task所拥有的内存空间
{ {
mword_t status = spinlock_lock(&tag_task->kobj.lock); mword_t status = spinlock_lock(&tag_task->kobj.lock);
if (status < 0) 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); spinlock_set(&tag_task->kobj.lock, status);
} }
break; 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])); tag = msg_tag_init4(0, 0, 0, task_set_pid(tag_task, f->r[0]));
} }
break; break;
case TASK_GET_PID://!<获取pid case TASK_GET_PID: //!< 获取pid
{ {
f->r[1] = tag_task->pid; f->r[1] = tag_task->pid;
tag = msg_tag_init4(0, 0, 0, 0); tag = msg_tag_init4(0, 0, 0, 0);

View File

@@ -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 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 KEN_OFFSET=0x2000
export INIT_OFFSET=0x10000 export INIT_OFFSET=0x10000
export BOOTFS_ADDR_OFFSET=0x20000 export BOOTFS_ADDR_OFFSET=0x21000
export KNL_DATA=0x20000000 export KNL_DATA=0x20000000
export KNL_DATA_SIZE=32M export KNL_DATA_SIZE=32M
export BOARD=STM32F2x export BOARD=STM32F2x

View File

@@ -1,6 +1,7 @@
#include "shell.h" #include "shell.h"
#include "cons_cli.h" #include "cons_cli.h"
#include "pm_cli.h"
#include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <dirent.h> #include <dirent.h>
#include <unistd.h> #include <unistd.h>
@@ -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); 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);

View File

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

View File

@@ -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_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_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_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_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); msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *alloc_addr);

View File

@@ -53,9 +53,10 @@ msg_tag_t task_get_pid(obj_handler_t dst_task, umword_t *pid)
return msg_tag_init(r0); 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 r0 asm("r0");
register volatile umword_t r1 asm("r1");
mk_syscall(syscall_prot_create(TASK_OBJ_VALID, TASK_PROT, dst_task).raw, mk_syscall(syscall_prot_create(TASK_OBJ_VALID, TASK_PROT, dst_task).raw,
0, 0,
@@ -68,9 +69,12 @@ msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx)
: :
: :
: "r0"); : "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) msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t dst_obj, uint8_t attrs)

View File

@@ -1,4 +1,6 @@
#pragma once #pragma once
#define PM_KILL_TASK_ALL 0x1
int pm_run_app(const char *path, int flags); int pm_run_app(const char *path, int flags);
int pm_kill_task(int pid, int flags); int pm_kill_task(int pid, int flags);

View File

@@ -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->ns_hd = cur_env->ns_hd;
uenv->rev1 = HANDLER_INVALID; uenv->rev1 = HANDLER_INVALID;
uenv->rev2 = 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), tag = thread_exec_regs(hd_thread, (umword_t)addr, ((umword_t)((umword_t)sp_addr_top - 8) & ~0x7UL),
ram_base, 1); ram_base, 1);

View File

@@ -4,11 +4,22 @@
#include "u_prot.h" #include "u_prot.h"
#include "u_task.h" #include "u_task.h"
#include "u_thread.h" #include "u_thread.h"
static obj_handler_t buf_hd = HANDLER_INVALID; #include "u_util.h"
#include <assert.h>
#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) obj_handler_t rpc_hd_get(int inx)
{ {
/*TODO:*/ assert(inx < RPC_SVR_MAP_OBJ_NR && inx >= 0);
return buf_hd; return buf_hd[inx];
} }
int rpc_hd_alloc(void) int rpc_hd_alloc(void)
{ {
@@ -17,9 +28,12 @@ int rpc_hd_alloc(void)
obj_handler_t hd; obj_handler_t hd;
bool_t alloc_new = TRUE; 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))
{
if (task_obj_valid(TASK_THIS, tmp_hd, 0).prot == 0)
{ {
alloc_new = FALSE; alloc_new = FALSE;
} }
@@ -34,10 +48,11 @@ int rpc_hd_alloc(void)
} }
else else
{ {
hd = buf_hd; hd = tmp_hd;
} }
thread_msg_buf_get(-1, (umword_t *)(&msg), NULL); thread_msg_buf_get(-1, (umword_t *)(&msg), NULL);
msg->map_buf[0] = vpage_create_raw3(0, 0, hd).raw; msg->map_buf[i] = vpage_create_raw3(0, 0, hd).raw;
buf_hd = hd; buf_hd[i] = hd;
}
return 0; return 0;
} }

View File

@@ -15,6 +15,8 @@
#include <stdio.h> #include <stdio.h>
#include "cons_svr.h" #include "cons_svr.h"
#include "namespace.h" #include "namespace.h"
#include "u_task.h"
#include <errno.h>
static pm_t pm; static pm_t pm;
void pm_init(void) void pm_init(void)
@@ -23,11 +25,32 @@ void pm_init(void)
meta_reg_svr_obj(&pm.svr_obj, PM_PROT); meta_reg_svr_obj(&pm.svr_obj, PM_PROT);
printf("pm runing..\n"); printf("pm runing..\n");
} }
int pm_rpc_kill_task(int pid, int flags) 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); printf("[pm] kill pid:%d.\n", pid);
ns_node_del_by_pid(pid, flags); ns_node_del_by_pid(pid, flags);
task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, pid));
return 0; return 0;
} }
int pm_rpc_run_app(const char *path, int flags) int pm_rpc_run_app(const char *path, int flags)