完善app启动时的参数传递
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user