支持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",
"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,

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

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

View File

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

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

View File

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

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

View File

@@ -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 <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)
{
/*TODO:*/
return buf_hd;
assert(inx < RPC_SVR_MAP_OBJ_NR && inx >= 0);
return buf_hd[inx];
}
int rpc_hd_alloc(void)
{
@@ -17,9 +28,12 @@ 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))
{
if (task_obj_valid(TASK_THIS, tmp_hd, 0).prot == 0)
{
alloc_new = FALSE;
}
@@ -34,10 +48,11 @@ int rpc_hd_alloc(void)
}
else
{
hd = buf_hd;
hd = tmp_hd;
}
thread_msg_buf_get(-1, (umword_t *)(&msg), NULL);
msg->map_buf[0] = vpage_create_raw3(0, 0, hd).raw;
buf_hd = hd;
msg->map_buf[i] = vpage_create_raw3(0, 0, hd).raw;
buf_hd[i] = hd;
}
return 0;
}

View File

@@ -15,6 +15,8 @@
#include <stdio.h>
#include "cons_svr.h"
#include "namespace.h"
#include "u_task.h"
#include <errno.h>
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)