zy-branch
hahahazhangyan 2 years ago
parent 739a868c75
commit 9041f98841

@ -37,34 +37,36 @@
#define SYS_CALL_VALUE 0x900001
#ifdef LOSCFG_QUICK_START
LITE_USER_SEC_RODATA STATIC CHAR *g_initPath = "/dev/shm/init";
LITE_USER_SEC_RODATA STATIC CHAR *g_initPath = "/dev/shm/init";// 根据编译条件选择不同的初始化路径
#else
LITE_USER_SEC_RODATA STATIC CHAR *g_initPath = "/bin/init";
#endif
// 定义一个系统调用函数参数为nbr、parm1、parm2和parm3返回值为UINT32类型
LITE_USER_SEC_TEXT STATIC UINT32 sys_call3(UINT32 nbr, UINT32 parm1, UINT32 parm2, UINT32 parm3)
{
// 使用汇编语言将参数nbr、parm1、parm2和parm3分别赋值给寄存器r7、r0、r1和r2
register UINT32 reg7 __asm__("r7") = (UINT32)(nbr);
register UINT32 reg2 __asm__("r2") = (UINT32)(parm3);
register UINT32 reg1 __asm__("r1") = (UINT32)(parm2);
register UINT32 reg0 __asm__("r0") = (UINT32)(parm1);
// 使用汇编语言执行系统调用系统调用号为SVC参数为SYS_CALL_VALUE系统调用值和寄存器r7、r0、r1和r2的值
__asm__ __volatile__
(
"svc %1"
: "=r"(reg0)
: "=r"(reg0)// 输出操作数列表将系统调用的返回值存放在reg0寄存器中
: "i"(SYS_CALL_VALUE), "r"(reg7), "r"(reg0), "r"(reg1), "r"(reg2)
: "memory", "r14"
: "memory", "r14" // 输入/输出操作数列表声明内存和寄存器r14为可修改的寄存器
);
// 返回系统调用的返回值
return reg0;
}
// 定义一个初始化函数参数为VOID类型的指针args返回值为VOID类型
LITE_USER_SEC_ENTRY VOID OsUserInit(VOID *args)
{
{// 如果定义了LOSCFG_KERNEL_DYNLOAD则执行系统调用execve参数为g_initPath、0和0即执行g_initPath指向的程序参数为0和0
#ifdef LOSCFG_KERNEL_DYNLOAD
sys_call3(__NR_execve, (UINTPTR)g_initPath, 0, 0);
#endif
#endif // 如果未定义LOSCFG_KERNEL_DYNLOAD则进入一个无限循环不执行任何操作
while (true) {
}
}

Loading…
Cancel
Save