支持kill命令
This commit is contained in:
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user