更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_user_init.c 文件参考

浏览源代码.

函数

LITE_USER_SEC_TEXT STATIC UINT32 sys_call3 (UINT32 nbr, UINT32 parm1, UINT32 parm2, UINT32 parm3)
 将 sys_call3 链接在 section(".user.text")段 更多...
 
LITE_USER_SEC_ENTRY VOID OsUserInit (VOID *args)
 

变量

LITE_USER_SEC_RODATA STATIC CHARg_initPath = "/dev/shm/init"
 

函数说明

◆ OsUserInit()

LITE_USER_SEC_ENTRY VOID OsUserInit ( VOID *  args)

在文件 los_user_init.c66 行定义.

67{
68#ifdef LOSCFG_KERNEL_DYNLOAD
69 sys_call3(__NR_execve, (UINTPTR)g_initPath, 0, 0);//发起系统调用,陷入内核态,对应 SysExecve ,加载elf运行
70#endif
71 while (true) {
72 }
73}
unsigned long UINTPTR
Definition: los_typedef.h:68
LITE_USER_SEC_RODATA STATIC CHAR * g_initPath
Definition: los_user_init.c:42
LITE_USER_SEC_TEXT STATIC UINT32 sys_call3(UINT32 nbr, UINT32 parm1, UINT32 parm2, UINT32 parm3)
将 sys_call3 链接在 section(".user.text")段
Definition: los_user_init.c:47
函数调用图:

◆ sys_call3()

LITE_USER_SEC_TEXT STATIC UINT32 sys_call3 ( UINT32  nbr,
UINT32  parm1,
UINT32  parm2,
UINT32  parm3 
)

将 sys_call3 链接在 section(".user.text")段

在文件 los_user_init.c47 行定义.

48{
49 register UINT32 reg7 __asm__("r7") = (UINT32)(nbr); //系统调用号给了R7寄存器
50 register UINT32 reg2 __asm__("r2") = (UINT32)(parm3);//R2 = 参数3
51 register UINT32 reg1 __asm__("r1") = (UINT32)(parm2);//R1 = 参数2
52 register UINT32 reg0 __asm__("r0") = (UINT32)(parm1);//R0 = 参数1
53
54 //SVC指令会触发一个特权调用异常。这为非特权软件调用操作系统或其他只能在PL1级别访问的系统组件提供了一种机制。
55 __asm__ __volatile__
56 (
57 "svc %1" //管理模式(svc) [10011]:操作系统使用的保护模式
58 : "=r"(reg0) //输出寄存器为R0
59 : "i"(SYS_CALL_VALUE), "r"(reg7), "r"(reg0), "r"(reg1), "r"(reg2)
60 : "memory", "r14"
61 );
62 //相当于执行了 reset_vector_mp.S 中的 向量表0x08对应的 _osExceptSwiHdl
63 return reg0;//reg0的值将在汇编中改变.
64}
macro EXC_SP_SET reg0
Definition: asm.h:50
macro EXC_SP_SET reg1 mrc 获取CPU信息 and mov reg1
Definition: asm.h:53
unsigned int UINT32
Definition: los_typedef.h:57
这是这个函数的调用关系图:

变量说明

◆ g_initPath

LITE_USER_SEC_RODATA STATIC CHAR * g_initPath = "/dev/shm/init"

在文件 los_user_init.c42 行定义.