优化代码&env支持&net fd自动回收支持(fastipc删除流程有问题,需要优化,可能导致卡死

This commit is contained in:
zhangzheng
2025-03-14 09:34:40 +08:00
parent c4518d9220
commit 137382205e
26 changed files with 272 additions and 320 deletions

View File

@@ -93,6 +93,10 @@ int cd(int argc, char *agrv[])
}
ret = chdir(agrv[1]);
if (ret >= 0)
{
setenv("PWD", agrv[1], 1);
}
return ret;
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), cd, cd, cd command);

View File

@@ -1455,17 +1455,42 @@ void shellExec(Shell *shell)
}
else
{
uint8_t params[FS_RPC_BUF_LEN];
uint8_t params[96/*FIXME:数组溢出*/];
uint8_t envs[64/*FIXME:*/];
int params_len = 0;
int envs_len = 0;
int pid;
bool_t bg_run = FALSE;
int task_mem_blk = 0;
// 处理params
for (int i = 1; i < shell->parser.paramCount; i++)
{
memcpy(&params[params_len], shell->parser.param[i], strlen(shell->parser.param[i]) + 1); // copy the string
params_len += strlen(shell->parser.param[i]) + 1;
}
if (shell->parser.param[shell->parser.paramCount - 1][0] == '~')
{
//指定启动的mem参数少一个
task_mem_blk = atoi(&(shell->parser.param[shell->parser.paramCount - 1][1]));
shell->parser.paramCount--;
}
if (strcmp(shell->parser.param[shell->parser.paramCount - 1], "&") == 0)
{
//后台启动,参数少一个
shell->parser.param[shell->parser.paramCount - 1] = NULL;
shell->parser.paramCount--;
bg_run = TRUE;
}
// 处理envs
for (char **e = __environ; *e; e++)
{
memcpy(&envs[envs_len], *e, strlen(*e) + 1);
envs_len+= strlen(*e)+1;
}
//!< 内建命令中未找到,则执行应用
pid = pm_run_app(shell->parser.param[0], 0 /*PM_APP_BG_RUN*/, params, params_len);
pid = pm_run_app(shell->parser.param[0], task_mem_blk, params, params_len, envs, envs_len);
if (pid < 0)
{
shellWriteString(shell, shellText[SHELL_TEXT_CMD_NOT_FOUND]);
@@ -1474,7 +1499,7 @@ void shellExec(Shell *shell)
{
pid_t cur_pid;
if (strcmp(shell->parser.param[shell->parser.paramCount - 1], "&") != 0)
if (!bg_run)
{
shell->parser.param[shell->parser.paramCount - 1] = NULL;
shell->parser.paramCount--;

View File

@@ -22,6 +22,7 @@
#include <poll.h>
#include <u_path.h>
#include "kstat.h"
#include "svr_path.h"
#define FS_PATH_LEN 64
static char cur_path[FS_PATH_LEN] = "/";
// AUTO_CALL(101)
@@ -36,9 +37,9 @@ void fs_backend_init(void)
assert(msg_tag_get_val(tag) >= 0);
if (cur_pid != 0)
{
assert(be_open("/dev/tty", O_RDWR, 0) >= 0);
assert(be_open("/dev/tty", O_RDWR, 0) >= 0);
assert(be_open("/dev/tty", O_RDWR, 0) >= 0);
assert(be_open(TTY_PATCH, O_RDWR, 0) >= 0);
assert(be_open(TTY_PATCH, O_RDWR, 0) >= 0);
assert(be_open(TTY_PATCH, O_RDWR, 0) >= 0);
}
else
{
@@ -109,10 +110,6 @@ int be_close(int fd)
}
switch (u_fd.type)
{
case FD_TTY:
{
}
break;
case FD_FS:
{
return fs_close(u_fd.priv_fd);
@@ -131,6 +128,7 @@ long sys_be_close(va_list ap)
return be_close(fd);
}
#if 0
static int be_tty_read(char *buf, long size)
{
pid_t pid;
@@ -167,6 +165,7 @@ static int be_tty_read(char *buf, long size)
}
return r_len;
}
#endif
long be_read(long fd, char *buf, long size)
{
fd_map_entry_t u_fd;
@@ -180,7 +179,11 @@ long be_read(long fd, char *buf, long size)
{
case FD_TTY:
{
#if 0
return be_tty_read(buf, size);
#else
return -ENOSYS;
#endif
}
break;
case FD_FS:
@@ -216,7 +219,7 @@ long be_write(long fd, char *buf, long size)
}
else
{
cons_write(buf, size);
return -ENOSYS;
}
return size;
}
@@ -247,6 +250,7 @@ long be_readv(long fd, const struct iovec *iov, long iovcnt)
{
case FD_TTY:
{
#if 0
pid_t pid;
int read_cn;
@@ -271,6 +275,9 @@ long be_readv(long fd, const struct iovec *iov, long iovcnt)
}
}
wlen += read_cn;
#else
return -ENOSYS;
#endif
}
break;
case FD_FS:
@@ -311,7 +318,7 @@ long be_writev(long fd, const struct iovec *iov, long iovcnt)
}
else
{
cons_write(iov[i].iov_base, iov[i].iov_len);
return -ENOSYS;
}
wlen += iov[i].iov_len;
}
@@ -377,13 +384,7 @@ long be_ioctl(long fd, long req, void *args)
{
case FD_TTY:
{
struct winsize *wsz = args;
wsz->ws_row = 30;
wsz->ws_col = 30;
wsz->ws_xpixel = 800;
wsz->ws_ypixel = 480;
ret = 0;
return -ENOSYS;
}
break;
case FD_FS:

View File

@@ -4,7 +4,7 @@
#include <sys/types.h>
#define PM_KILL_TASK_ALL 0x1
int pm_run_app(const char *path, int flags, uint8_t *params, int params_len);
int pm_run_app(const char *path, int mem_block, uint8_t *params, int params_len, uint8_t *envs, int envs_len);
int pm_kill_task(int pid, int flags, int exit_code);
int pm_watch_pid(obj_handler_t sig_hd, pid_t pid, int flags);
int pm_copy_data(pid_t src_pid, pid_t dst_pid, addr_t src_addr, addr_t dst_addr, size_t len);

View File

@@ -35,7 +35,7 @@ typedef struct pm
#define PM_APP_BG_RUN 0x1
void pm_svr_obj_init(pm_t *pm);
int pm_rpc_run_app(const char *path, int flags, char *params, int params_len);
int pm_rpc_run_app(const char *path, int mem_block, char *params, int params_len, char *env, int envs_len);
int pm_rpc_kill_task(int src_pid, int pid, int flags, int exit_code);
int pm_rpc_watch_pid(pm_t *pm, obj_handler_t sig_rcv_hd, pid_t pid, int flags);

View File

@@ -0,0 +1,5 @@
#pragma once
#define TTY_PATCH "/dev/tty"
#define NET_PATCH "/dev/net"

View File

@@ -11,29 +11,38 @@
#include <string.h>
#include <assert.h>
RPC_GENERATION_CALL4(pm_t, PM_PROT, PM_RUN_APP, run_app,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, params,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, params_len)
int pm_run_app(const char *path, int flags, uint8_t *params, int params_len)
RPC_GENERATION_CALL6(pm_t, PM_PROT, PM_RUN_APP, run_app,
rpc_ref_array_uint32_t_uint8_t_64_t, rpc_array_uint32_t_uint8_t_64_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, mem_block,
rpc_ref_array_uint32_t_uint8_t_96_t, rpc_array_uint32_t_uint8_t_96_t, RPC_DIR_IN, RPC_TYPE_DATA, params,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, params_len,
rpc_ref_array_uint32_t_uint8_t_64_t, rpc_array_uint32_t_uint8_t_64_t, RPC_DIR_IN, RPC_TYPE_DATA, envs,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, envs_len)
int pm_run_app(const char *path, int mem_block, uint8_t *params, int params_len, uint8_t *envs, int envs_len)
{
rpc_ref_file_array_t rpc_path = {
rpc_ref_array_uint32_t_uint8_t_64_t rpc_path = {
.data = (uint8_t *)path,
.len = MIN(strlen(path) + 1, FS_RPC_BUF_LEN),
.len = MIN(strlen(path) + 1, 64),
};
rpc_int_t rpc_flags = {
.data = flags,
rpc_int_t rpc_mem_block = {
.data = mem_block,
};
rpc_ref_file_array_t rpc_params = {
.data = (uint8_t *)params,
.len = MIN(params_len, FS_RPC_BUF_LEN),
rpc_ref_array_uint32_t_uint8_t_96_t rpc_params = {
.data = (uint8_t *)params?params:"",
.len = MIN(params_len, 96),
};
rpc_int_t rpc_params_len = {
.data = params_len,
};
msg_tag_t tag = pm_t_run_app_call(u_get_global_env()->ns_hd, &rpc_path, &rpc_flags,
&rpc_params, &rpc_params_len);
rpc_ref_array_uint32_t_uint8_t_64_t rpc_envs = {
.data = (uint8_t *)envs?envs:"",
.len = MIN(envs_len, 64),
};
rpc_int_t rpc_envs_len = {
.data = envs_len,
};
msg_tag_t tag = pm_t_run_app_call(u_get_global_env()->ns_hd, &rpc_path, &rpc_mem_block,
&rpc_params, &rpc_params_len, &rpc_envs, &rpc_envs_len);
return msg_tag_get_val(tag);
}

View File

@@ -22,24 +22,29 @@
* @brief 运行app
* run_app
*/
RPC_GENERATION_OP4(pm_t, PM_PROT, PM_RUN_APP, run_app,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, params,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, params_len)
RPC_GENERATION_OP6(pm_t, PM_PROT, PM_RUN_APP, run_app,
rpc_ref_array_uint32_t_uint8_t_64_t, rpc_array_uint32_t_uint8_t_64_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, mem_block,
rpc_ref_array_uint32_t_uint8_t_96_t, rpc_array_uint32_t_uint8_t_96_t, RPC_DIR_IN, RPC_TYPE_DATA, params,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, params_len,
rpc_ref_array_uint32_t_uint8_t_64_t, rpc_array_uint32_t_uint8_t_64_t, RPC_DIR_IN, RPC_TYPE_DATA, envs,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, envs_len
)
{
int16_t ret = -1;
path->data[path->len - 1] = 0;
ret = pm_rpc_run_app(path->data, flags->data, params->data, params_len->data);
ret = pm_rpc_run_app(path->data, mem_block->data, params->data, params_len->data, envs->data, envs_len->data);
return ret;
}
RPC_GENERATION_DISPATCH4(pm_t, PM_PROT, PM_RUN_APP, run_app,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, flags,
rpc_ref_file_array_t, rpc_file_array_t, RPC_DIR_IN, RPC_TYPE_DATA, params,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, params_len)
RPC_GENERATION_DISPATCH6(pm_t, PM_PROT, PM_RUN_APP, run_app,
rpc_ref_array_uint32_t_uint8_t_64_t, rpc_array_uint32_t_uint8_t_64_t, RPC_DIR_IN, RPC_TYPE_DATA, path,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, mem_block,
rpc_ref_array_uint32_t_uint8_t_96_t, rpc_array_uint32_t_uint8_t_96_t, RPC_DIR_IN, RPC_TYPE_DATA, params,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, params_len,
rpc_ref_array_uint32_t_uint8_t_64_t, rpc_array_uint32_t_uint8_t_64_t, RPC_DIR_IN, RPC_TYPE_DATA, envs,
rpc_int_t, rpc_int_t, RPC_DIR_IN, RPC_TYPE_DATA, envs_len)
/*kill_task*/
RPC_GENERATION_OP3(pm_t, PM_PROT, PM_KILL_TASK, kill_task,

View File

@@ -6,5 +6,4 @@
int app_load(const char *name, uenv_t *cur_env, pid_t *pid,
char *argv[], int arg_cn,
char *envp[], int envp_cn,
obj_handler_t *p_sem_hd,
int mem_block);

View File

@@ -120,12 +120,10 @@ static void *app_stack_push_array(obj_handler_t task_obj, umword_t **stack, uint
int app_load(const char *name, uenv_t *cur_env, pid_t *pid,
char *argv[], int arg_cn,
char *envp[], int envp_cn,
obj_handler_t *p_sem_hd,
int mem_block)
{
msg_tag_t tag;
sys_info_t sys_info;
assert(p_sem_hd);
tag = sys_read_info(SYS_PROT, &sys_info, 0);
if (msg_tag_get_val(tag) < 0)
@@ -187,7 +185,6 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid,
umword_t ram_base;
obj_handler_t hd_task = handler_alloc();
obj_handler_t hd_thread = handler_alloc();
obj_handler_t hd_sem = handler_alloc();
if (hd_task == HANDLER_INVALID)
{
@@ -197,10 +194,6 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid,
{
goto end;
}
if (hd_sem == HANDLER_INVALID)
{
goto end;
}
tag = factory_create_task(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, hd_task));
if (msg_tag_get_prot(tag) < 0)
{
@@ -211,11 +204,6 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid,
{
goto end_del_obj;
}
tag = facotry_create_sema(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, hd_sem), 0, (uint32_t)(-1));
if (msg_tag_get_prot(tag) < 0)
{
goto end_del_obj;
}
tag = task_alloc_ram_base(hd_task, app ? app->i.ram_size : 100 * 1024 /*TODO:*/,
&ram_base, mem_block);
if (msg_tag_get_prot(tag) < 0)
@@ -227,11 +215,6 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid,
{
goto end_del_obj;
}
tag = task_map(hd_task, hd_sem, SEMA_PROT, 0);
if (msg_tag_get_prot(tag) < 0)
{
goto end_del_obj;
}
tag = task_map(hd_task, cur_env->ns_hd, LOG_PROT, KOBJ_DELETE_RIGHT);
if (msg_tag_get_prot(tag) < 0)
{
@@ -368,7 +351,6 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid,
ram_base, 0);
assert(msg_tag_get_prot(tag) >= 0);
*p_sem_hd = hd_sem;
/*启动线程运行*/
tag = thread_run(hd_thread, 3);
assert(msg_tag_get_prot(tag) >= 0);
@@ -384,10 +366,6 @@ end_del_obj:
{
task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, hd_task));
}
if (hd_sem != HANDLER_INVALID)
{
task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, hd_sem));
}
end:
if (hd_task != HANDLER_INVALID)
{
@@ -397,9 +375,5 @@ end:
{
handler_free(hd_thread);
}
if (hd_sem != HANDLER_INVALID)
{
handler_free(hd_sem);
}
return -ENOMEM;
}