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