80 if ((loadInfo == NULL) || (loadInfo->
elfEntry == 0)) {
91 CHAR *workingDirectory = NULL;
92 UINT32 len, workPathLen, newLen;
94 if (
access(fileName, F_OK) < 0) {
96 if (workingDirectory == NULL) {
99 len = strlen(fileName);
100 workPathLen = strlen(workingDirectory);
101 newLen = len + 1 + workPathLen + 1;
102 if (newLen >= maxLen) {
105 if (strncpy_s(buf, maxLen, workingDirectory, workPathLen) != EOK) {
106 PRINT_ERR(
"strncpy_s failed, errline: %d!\n", __LINE__);
109 buf[workPathLen] =
'/';
110 if (strncpy_s(buf + workPathLen + 1, maxLen - workPathLen - 1, fileName, len) != EOK) {
111 PRINT_ERR(
"strncpy_s failed, errline: %d!\n", __LINE__);
115 if (
access(buf, F_OK) < 0) {
134 if (err == -EFAULT) {
136 }
else if (err > PATH_MAX) {
137 PRINT_ERR(
"%s[%d], filename len exceeds maxlen: %d\n", __FUNCTION__, __LINE__, PATH_MAX);
138 return -ENAMETOOLONG;
141 strLen = strlen(fileName);
142 err = memcpy_s(kfileName, PATH_MAX, fileName, strLen);
144 PRINT_ERR(
"%s[%d], Copy failed! err: %d\n", __FUNCTION__, __LINE__, err);
168 CHAR kfileName[PATH_MAX + 1] = { 0 };
171 CHAR buf[PATH_MAX + 1] = { 0 };
184 if (
OsGetRealPath(kfileName, buf, (PATH_MAX + 1)) != LOS_OK) {
187 if (buf[0] !=
'\0') {
194 PRINT_ERR(
"%s %d, failed to allocate new vm space\n", __FUNCTION__, __LINE__);
198 loadInfo.
argv = argv;
199 loadInfo.
envp = envp;
char * OsShellGetWorkingDirectory(void)
VOID *(* TSK_ENTRY_FUNC)(UINTPTR param1, UINTPTR param2, UINTPTR param3, UINTPTR param4)
Define the type of a task entrance function.
STATIC INT32 OsGetRealPath(const CHAR *fileName, CHAR *buf, UINT32 maxLen)
STATIC INT32 OsExecve(const ELFLoadInfo *loadInfo)
运行ELF
INT32 LOS_DoExecveFile(const CHAR *fileName, CHAR *const *argv, CHAR *const *envp)
LOS_DoExecveFile 根据fileName执行一个新的用户程序 LOS_DoExecveFile接口一般由用户通过execve系列接口利用系统调用机制调用创建新的进程,内核不能直接调用该接口...
STATIC INT32 OsCopyUserParam(ELFLoadInfo *loadInfo, const CHAR *fileName, CHAR *kfileName, UINT32 maxSize)
INT32 OsLoadELFFile(ELFLoadInfo *loadInfo)
LITE_OS_SEC_TEXT UINT32 OsExecStart(const TSK_ENTRY_FUNC entry, UINTPTR sp, UINTPTR mapBase, UINT32 mapSize)
执行用户态任务, entry为入口函数 ,其中 创建好task,task上下文 等待调度真正执行, sp:栈指针 mapBase:栈底 mapSize:栈大小
LITE_OS_SEC_TEXT VOID LOS_Exit(INT32 status)
LOS_Exit 进程退出
LITE_OS_SEC_TEXT UINT32 OsExecRecycleAndInit(LosProcessCB *processCB, const CHAR *name, LosVmSpace *oldSpace, UINTPTR oldFiles)
进程的回收再利用,被LOS_DoExecveFile调用
STATIC INLINE LosProcessCB * OsCurrProcessGet(VOID)
STATIC INLINE BOOL LOS_IsKernelAddress(VADDR_T vaddr)
虚拟地址是否在内核空间
STATUS_T LOS_VmSpaceFree(LosVmSpace *space)
LosVmSpace * OsCreateUserVmSpace(VOID)
创建用户进程空间
STATIC INLINE BOOL LOS_IsUserAddress(VADDR_T vaddr)
虚拟地址是否在用户空间
INT32 LOS_StrncpyFromUser(CHAR *dst, const CHAR *src, INT32 count)
LosVmSpace * oldSpace
旧虚拟空间
UINTPTR elfEntry
装载点地址 即: _start 函数地址
const CHAR * fileName
文件名称
LosVmSpace * newSpace
新虚拟空间
UINTPTR stackBase
栈顶位置,栈基地址
UINTPTR stackTop
栈底位置,递减满栈下,stackTop是高地址位
int access(const char *path, int amode)