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

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

Loading…
Cancel
Save