LITE_OS_SEC_TEXT_INIT UINT32 OsUserInitProcess(VOID)

{

INT32 ret;

UINT32 size;

TSK_INIT_PARAM_S param = { 0 };

VOID *stack = NULL;

VOID *userText = NULL;

CHAR *userInitTextStart = (CHAR *)&__user_init_entry;//*kfy 代码区开始位置

CHAR *userInitBssStart = (CHAR *)&__user_init_bss;//*kyf 未初始化数据区(BSS)。在运行时改变其值

CHAR *userInitEnd = (CHAR *)&__user_init_end;//*kyf 结束地址

UINT32 initBssSize = userInitEnd - userInitBssStart;

UINT32 initSize = userInitEnd - userInitTextStart;

LosProcessCB *processCB = OS_PCB_FROM_PID(g_userInitProcess);

ret = OsProcessCreateInit(processCB, OS_USER_MODE, "Init", OS_PROCESS_USERINIT_PRIORITY);//*kyf 初始化用户进程,它将是所有应用程序的父进程

if (ret != LOS_OK) {

return ret;

}

userText = LOS_PhysPagesAllocContiguous(initSize >> PAGE_SHIFT);//*kyf 分配连续的物理页

if (userText == NULL) {

ret = LOS_NOK;

goto ERROR;

}

(VOID)memcpy_s(userText, initSize, (VOID *)&__user_init_load_addr, initSize);//*kyf 安全copy 经加载器load的结果 __user_init_load_addr -> userText

ret = LOS_VaddrToPaddrMmap(processCB->vmSpace, (VADDR_T)(UINTPTR)userInitTextStart, LOS_PaddrQuery(userText),

initSize, VM_MAP_REGION_FLAG_PERM_READ | VM_MAP_REGION_FLAG_PERM_WRITE |

VM_MAP_REGION_FLAG_PERM_EXECUTE | VM_MAP_REGION_FLAG_PERM_USER);//*kyf 虚拟地址与物理地址的映射

if (ret < 0) {

goto ERROR;

}

(VOID)memset_s((VOID *)((UINTPTR)userText + userInitBssStart - userInitTextStart), initBssSize, 0, initBssSize);//*kyf 除了代码段,其余都清0

stack = OsUserInitStackAlloc(g_userInitProcess, &size);//*kyf 初始化堆栈区

if (stack == NULL) {

PRINTK("user init process malloc user stack failed!\n");

ret = LOS_NOK;

goto ERROR;

}

param.pfnTaskEntry = (TSK_ENTRY_FUNC)userInitTextStart;//*kyf 从代码区开始执行,也就是应用程序main 函数的位置

param.userParam.userSP = (UINTPTR)stack + size;//*kyf 指向栈顶

param.userParam.userMapBase = (UINTPTR)stack;//*kyf 栈底

param.userParam.userMapSize = size;//*kyf 栈大小

param.uwResved = OS_TASK_FLAG_PTHREAD_JOIN;//*kyf 可结合的(joinable)能够被其他线程收回其资源和杀死

ret = OsUserInitProcessStart(g_userInitProcess, ¶m);//*kyf 创建一个任务,来运行main函数

if (ret != LOS_OK) {

(VOID)OsUnMMap(processCB->vmSpace, param.userParam.userMapBase, param.userParam.userMapSize);

goto ERROR;

}

return LOS_OK;

ERROR:

(VOID)LOS_PhysPagesFreeContiguous(userText, initSize >> PAGE_SHIFT);

OsDeInitPCB(processCB);

return ret;

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐