完善app启动时的参数传递

This commit is contained in:
zhangzheng
2024-02-04 22:24:56 +08:00
parent 931bb451b9
commit 0c7ed146c6
11 changed files with 182 additions and 42 deletions

View File

@@ -10,7 +10,7 @@ CONFIG_KNL_DATA_SIZE=0x10000
CONFIG_KNL_OFFSET=0x2000
CONFIG_INIT_TASK_OFFSET=0x10000
CONFIG_BOOTFS_OFFSET=0x22000
CONFIG_MK_MPU_CFG=n
CONFIG_MK_MPU_CFG=y
CONFIG_FT_ADDR_NR=16
CONFIG_SYS_SCHE_HZ=1000
CONFIG_USER_ISR_START_NO=16

View File

@@ -55,7 +55,7 @@ void arch_enable_irq(int inx)
}
void arch_set_enable_irq_prio(int inx, int sub_prio, int pre_prio)
{
// TODO:
// TODO: 设置优先级
// NVIC_InitTypeDef NVIC_InitStructure;
// NVIC_InitStructure.NVIC_IRQChannel = inx;
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = pre_prio;

View File

@@ -18,6 +18,9 @@
#include "knl_misc.h"
#include "spinlock.h"
#include "string.h"
#include "assert.h"
#include "access.h"
#include "printk.h"
/**
* @brief 任务的操作码
*
@@ -30,6 +33,7 @@ enum task_op_code
TASK_OBJ_VALID, //!< 判断一个对象是否有效
TASK_SET_PID, //!< 设置task的pid
TASK_GET_PID, //!< 获取task的pid
TASK_COPY_DATA, //!< 拷贝数据到task的数据区域
};
static bool_t task_put(kobject_t *kobj);
static void task_release_stage1(kobject_t *kobj);
@@ -255,6 +259,31 @@ 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_COPY_DATA: //!< 拷贝数据到task的内存区域
{
void *mem;
size_t size;
umword_t st_addr = f->r[0];
size_t cp_size = f->r[1];
if (cp_size > THREAD_MSG_BUG_LEN)
{
tag = msg_tag_init4(0, 0, 0, -EINVAL);
break;
}
if (!is_rw_access(tag_task, (void *)st_addr, cp_size, FALSE))
{
tag = msg_tag_init4(0, 0, 0, -EPERM);
break;
}
// printk("addr:0x%x %d.\n", st_addr, cp_size);
void *msg = thread_get_msg_buf(thread_get_current());
memcpy((void *)st_addr, msg, cp_size);
tag = msg_tag_init4(0, 0, 0, 0);
break;
}
case TASK_SET_PID: //!< 设置pid
{
tag = msg_tag_init4(0, 0, 0, task_set_pid(tag_task, f->r[0]));
@@ -366,7 +395,7 @@ static kobject_t *task_create_func(ram_limit_t *lim, umword_t arg0, umword_t arg
}
/**
* @brief 工厂注册函数 TODO:
* @brief 工厂注册函数
*
*/
void task_factory_register(void)

View File

@@ -39,11 +39,6 @@ void thread_user_pf_set(thread_t *cur_th, void *pc, void *user_sp, void *ram, um
// assert((((umword_t)user_sp) & 0x7UL) == 0);
umword_t usp = ((umword_t)(user_sp) & ~0x7UL);
if (stack)
{
usp -= THREAD_MSG_BUG_LEN;
memcpy((void *)usp, (void *)stack, THREAD_MSG_BUG_LEN);
}
pf_t *cur_pf = (pf_t *)(usp)-1; // thread_get_pf(cur_th);

View File

@@ -13,3 +13,4 @@ msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx, int *obj
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);
msg_tag_t task_copy_data(obj_handler_t task_obj, void *st_addr, umword_t size);

View File

@@ -10,6 +10,7 @@ enum task_op_code
TASK_OBJ_VALID,
TASK_SET_PID,
TASK_GET_PID,
TASK_COPY_DATA,
};
msg_tag_t task_set_pid(obj_handler_t dst_task, umword_t pid)
{
@@ -135,3 +136,21 @@ msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *all
return msg_tag_init(r0);
}
msg_tag_t task_copy_data(obj_handler_t task_obj, void *st_addr, umword_t size)
{
register volatile umword_t r0 asm("r0");
mk_syscall(syscall_prot_create(TASK_COPY_DATA, TASK_PROT, task_obj).raw,
st_addr,
size,
0,
0,
0,
0);
asm __volatile__(""
:
:
: "r0", "r1");
return msg_tag_init(r0);
}

View File

@@ -2,4 +2,4 @@
#include <sys/types.h>
#include "u_env.h"
int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int arg_cn);
int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int arg_cn, char *env[], int env_cn);

View File

@@ -1,4 +1,13 @@
/**
* @file u_app_loader.c
* @author ATShining (1358745329@qq.com)
* @brief
* @version 0.1
* @date 2024-02-04
*
* @copyright Copyright (c) 2024
*
*/
#include "u_types.h"
#include "u_prot.h"
#include "u_app.h"
@@ -31,13 +40,78 @@ static umword_t app_stack_push(umword_t *stack, umword_t val)
return (umword_t)stack;
}
/**
* @brief 放入一个无符号整型
*
* @param task_obj
* @param stack
* @param val
*/
static void *app_stack_push_umword(obj_handler_t task_obj, umword_t **stack, umword_t val)
{
ipc_msg_t *msg = thread_get_cur_ipc_msg();
(*stack)--;
msg->msg_buf[0] = val;
task_copy_data(task_obj, *stack, sizeof(umword_t));
return *stack;
}
/**
* @brief 放入一个字符串
*
* @param task_obj
* @param stack
* @param str
*/
static void *app_stack_push_str(obj_handler_t task_obj, umword_t **stack, const char *str)
{
ipc_msg_t *msg = thread_get_cur_ipc_msg();
int len = strlen(str) + 1;
char *cp_data = (char *)msg->msg_buf;
len = MIN(len, ARRAY_SIZE(msg->msg_buf) * sizeof(umword_t));
*stack -= ALIGN(len, sizeof(void *)) / sizeof(void *);
memcpy(cp_data, str, len);
cp_data[len - 1] = 0;
task_copy_data(task_obj, *stack, len);
return *stack;
}
/**
* @brief 压入数组
*
* @param task_obj
* @param stack
* @param arr
* @param len
* @return void*
*/
static void *app_stack_push_array(obj_handler_t task_obj, umword_t **stack, uint8_t *arr, size_t len)
{
ipc_msg_t *msg = thread_get_cur_ipc_msg();
char *cp_data = (char *)msg->msg_buf;
len = MIN(len, ARRAY_SIZE(msg->msg_buf) * sizeof(umword_t));
*stack -= ALIGN(len, sizeof(void *)) / sizeof(void *);
memcpy(cp_data, arr, len);
cp_data[len - 1] = 0;
task_copy_data(task_obj, *stack, len);
return *stack;
}
/**
* @brief 加载并执行一个app
*
* @param name app的名字
* @return int
*/
int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int arg_cn)
int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int arg_cn, char *envp[], int envp_cn)
{
msg_tag_t tag;
sys_info_t sys_info;
@@ -154,41 +228,55 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar
void *sp_addr = (char *)ram_base + app->i.stack_offset - app->i.data_offset;
void *sp_addr_top = (char *)sp_addr + app->i.stack_size;
umword_t usp_top = ((umword_t)((umword_t)sp_addr_top - 8) & ~0x7UL) - MSG_BUG_LEN;
umword_t *usp_top = (umword_t *)((umword_t)((umword_t)sp_addr_top - 8) & ~0x7UL);
uenv_t uenv = {
.log_hd = cur_env->ns_hd,
.ns_hd = cur_env->ns_hd,
.rev1 = HANDLER_INVALID,
.rev2 = HANDLER_INVALID,
};
umword_t *app_env;
char *cp_args;
char *cp_envp;
/**处理传参*/
umword_t *buf;
thread_msg_buf_get(THREAD_MAIN, (umword_t *)(&buf), NULL);
umword_t *buf_bk = buf;
#define ARG_WORD_NR 10 // 40bytes
buf = (umword_t *)app_stack_push(buf, 1 + arg_cn); //!< argc 24
buf = (umword_t *)app_stack_push(buf, (umword_t)usp_top + ARG_WORD_NR * 4); //!< argv[0]
buf = (umword_t *)app_stack_push(buf, 0); //!< NULL
buf = (umword_t *)app_stack_push(buf, (umword_t)usp_top + ARG_WORD_NR * 4 + 16); //!< env[0...N]
buf = (umword_t *)app_stack_push(buf, 0); //!< NULL
app_env = app_stack_push_array(hd_task, &usp_top, (uint8_t *)(&uenv), sizeof(uenv));
for (int i = 0; i < arg_cn; i++)
{
cp_args = app_stack_push_str(hd_task, &usp_top, argv[i]);
}
for (int i = 0; i < envp_cn; i++)
{
cp_envp = app_stack_push_str(hd_task, &usp_top, envp[i]);
}
buf = (umword_t *)app_stack_push(buf, (umword_t)AT_PAGESZ); //!< auxvt[0...N]
buf = (umword_t *)app_stack_push(buf, MK_PAGE_SIZE); //!< auxvt[0...N]
buf = (umword_t *)app_stack_push(buf, 0xfe); //!< auxvt[0...N] mkrtos_env
buf = (umword_t *)app_stack_push(buf, (umword_t)usp_top + ARG_WORD_NR * 4 + 16 + 16); //!< auxvt[0...N]
buf = (umword_t *)app_stack_push(buf, 0); //!< NULL
app_stack_push_umword(hd_task, &usp_top, 0);
// set args & env.
app_stack_push_umword(hd_task, &usp_top, (umword_t)app_env);
app_stack_push_umword(hd_task, &usp_top, 0xfe);
memcpy((char *)buf_bk + ARG_WORD_NR * 4, name, strlen(name) + 1);
memcpy((char *)buf_bk + ARG_WORD_NR * 4 + 16, "PATH=/", strlen("PATH=/") + 1);
app_stack_push_umword(hd_task, &usp_top, MK_PAGE_SIZE);
app_stack_push_umword(hd_task, &usp_top, (umword_t)AT_PAGESZ);
// set user env. 16 bytes
uenv_t *uenv = (uenv_t *)((char *)buf_bk + ARG_WORD_NR * 4 + 16 + 16);
uenv->log_hd = cur_env->ns_hd;
uenv->ns_hd = cur_env->ns_hd;
uenv->rev1 = HANDLER_INVALID;
uenv->rev2 = HANDLER_INVALID;
printf("pid:%d, stack env:%p, env:%p\n", hd_task,
(void *)((umword_t)usp_top + ARG_WORD_NR * 4 + 16 + 16), uenv);
app_stack_push_umword(hd_task, &usp_top, 0);
for (int i = 0; i < envp_cn; i++)
{
app_stack_push_umword(hd_task, &usp_top, (umword_t)cp_envp);
cp_envp += ALIGN(strlen(envp[i]), sizeof(void *));
}
if (arg_cn)
{
app_stack_push_umword(hd_task, &usp_top, 0);
for (int i = 0; i < arg_cn; i++)
{
app_stack_push_umword(hd_task, &usp_top, (umword_t)cp_args);
cp_args += ALIGN(strlen(argv[i]) + 1, sizeof(void *));
}
}
app_stack_push_umword(hd_task, &usp_top, arg_cn);
tag = thread_exec_regs(hd_thread, (umword_t)addr, ((umword_t)((umword_t)sp_addr_top - 8) & ~0x7UL),
ram_base, 1);
printf("pid:%d stack:%p\n", hd_task, usp_top);
tag = thread_exec_regs(hd_thread, (umword_t)addr, (umword_t)usp_top,
ram_base, 0);
assert(msg_tag_get_prot(tag) >= 0);
/*启动线程运行*/
tag = thread_run(hd_thread, 2);

View File

@@ -73,7 +73,11 @@ int parse_cfg(const char *parse_cfg_file_name, uenv_t *env)
name[MIN(line_inx, sizeof(name)) - 1] = 0;
}
pid_t pid;
int ret = app_load(name, env, &pid, NULL, 0);
char *args[] = {
name,
"-t"
};
int ret = app_load(name, env, &pid, args, 2, NULL, 0);
if (ret < 0)
{
printf("%s load fail, 0x%x\n", name, ret);

View File

@@ -210,7 +210,7 @@ int pm_rpc_run_app(const char *path, int flags)
int ret;
printf("pm run %s.\n", path);
ret = app_load(path, u_get_global_env(), &pid, NULL, 0);
ret = app_load(path, u_get_global_env(), &pid, NULL, 0, NULL, 0);
if (ret > 0)
{
if (!(flags & PM_APP_BG_RUN))

View File

@@ -6,6 +6,10 @@
#include <shell_port.h>
int main(int argc, char *args[])
{
for (int i = 0; i < argc; i++)
{
printf("args[%d]:%s\n", i, args[i]);
}
userShellInit();
return 0;
}