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

浏览源代码.

函数

INT32 LOS_DoExecveFile (const CHAR *fileName, CHAR *const *argv, CHAR *const *envp)
 LOS_DoExecveFile 根据fileName执行一个新的用户程序 LOS_DoExecveFile接口一般由用户通过execve系列接口利用系统调用机制调用创建新的进程,内核不能直接调用该接口启动新进程。 更多...
 

函数说明

◆ LOS_DoExecveFile()

INT32 LOS_DoExecveFile ( const CHAR fileName,
CHAR *const *  argv,
CHAR *const *  envp 
)

LOS_DoExecveFile 根据fileName执行一个新的用户程序 LOS_DoExecveFile接口一般由用户通过execve系列接口利用系统调用机制调用创建新的进程,内核不能直接调用该接口启动新进程。

参数
argv程序执行所需的参数序列,以NULL结尾。无需参数时填入NULL。
envp程序执行所需的新的环境变量序列,以NULL结尾。无需新的环境变量时填入NULL。
fileName二进制可执行文件名,可以是路径名。
返回
参见

在文件 los_exec_elf.c165 行定义.

166{
167 ELFLoadInfo loadInfo = { 0 };
168 CHAR kfileName[PATH_MAX + 1] = { 0 };//此时已陷入内核态,所以局部变量都在内核空间
169 INT32 ret;
170#ifdef LOSCFG_SHELL
171 CHAR buf[PATH_MAX + 1] = { 0 };
172#endif
173 //先判断参数地址是否来自用户空间,此处必须要来自用户空间,内核是不能直接调用本函数
174 if ((fileName == NULL) || ((argv != NULL) && !LOS_IsUserAddress((VADDR_T)(UINTPTR)argv)) ||
175 ((envp != NULL) && !LOS_IsUserAddress((VADDR_T)(UINTPTR)envp))) {
176 return -EINVAL;
177 }
178 ret = OsCopyUserParam(&loadInfo, fileName, kfileName, PATH_MAX);//拷贝用户空间数据至内核空间
179 if (ret != LOS_OK) {
180 return ret;
181 }
182
183#ifdef LOSCFG_SHELL
184 if (OsGetRealPath(kfileName, buf, (PATH_MAX + 1)) != LOS_OK) {//获取绝对路径
185 return -ENOENT;
186 }
187 if (buf[0] != '\0') {
188 loadInfo.fileName = buf;
189 }
190#endif
191
192 loadInfo.newSpace = OsCreateUserVmSpace();//创建一个用户空间,用于开启新的进程
193 if (loadInfo.newSpace == NULL) {
194 PRINT_ERR("%s %d, failed to allocate new vm space\n", __FUNCTION__, __LINE__);
195 return -ENOMEM;
196 }
197
198 loadInfo.argv = argv;//参数数组
199 loadInfo.envp = envp;//环境数组
200
201 ret = OsLoadELFFile(&loadInfo);//加载ELF文件
202 if (ret != LOS_OK) {
203 return ret;
204 }
205 //对当前进程旧虚拟空间和文件进行回收
206 ret = OsExecRecycleAndInit(OsCurrProcessGet(), loadInfo.fileName, loadInfo.oldSpace, loadInfo.oldFiles);
207 if (ret != LOS_OK) {
208 (VOID)LOS_VmSpaceFree(loadInfo.oldSpace);//释放虚拟空间
209 goto OUT;
210 }
211
212 ret = OsExecve(&loadInfo);//运行ELF内容
213 if (ret != LOS_OK) {
214 goto OUT;
215 }
216
217 return loadInfo.stackTop;
218
219OUT:
220 (VOID)LOS_Exit(OS_PRO_EXIT_OK);
221 return ret;
222}
STATIC INT32 OsGetRealPath(const CHAR *fileName, CHAR *buf, UINT32 maxLen)
Definition: los_exec_elf.c:89
STATIC INT32 OsExecve(const ELFLoadInfo *loadInfo)
运行ELF
Definition: los_exec_elf.c:78
STATIC INT32 OsCopyUserParam(ELFLoadInfo *loadInfo, const CHAR *fileName, CHAR *kfileName, UINT32 maxSize)
Definition: los_exec_elf.c:127
INT32 OsLoadELFFile(ELFLoadInfo *loadInfo)
LITE_OS_SEC_TEXT VOID LOS_Exit(INT32 status)
LOS_Exit 进程退出
Definition: los_process.c:2086
LITE_OS_SEC_TEXT UINT32 OsExecRecycleAndInit(LosProcessCB *processCB, const CHAR *name, LosVmSpace *oldSpace, UINTPTR oldFiles)
进程的回收再利用,被LOS_DoExecveFile调用
Definition: los_process.c:1568
STATIC INLINE LosProcessCB * OsCurrProcessGet(VOID)
signed int INT32
Definition: los_typedef.h:60
unsigned long VADDR_T
Definition: los_typedef.h:208
unsigned long UINTPTR
Definition: los_typedef.h:68
char CHAR
Definition: los_typedef.h:63
STATUS_T LOS_VmSpaceFree(LosVmSpace *space)
LosVmSpace * OsCreateUserVmSpace(VOID)
创建用户进程空间
Definition: los_vm_map.c:281
STATIC INLINE BOOL LOS_IsUserAddress(VADDR_T vaddr)
虚拟地址是否在用户空间
Definition: los_vm_map.h:275
LosVmSpace * oldSpace
旧虚拟空间
Definition: los_load_elf.h:122
CHAR *const * envp
环境变量数组
Definition: los_load_elf.h:109
CHAR *const * argv
参数数组
Definition: los_load_elf.h:108
const CHAR * fileName
文件名称
Definition: los_load_elf.h:104
UINTPTR oldFiles
旧空间的文件映像
Definition: los_load_elf.h:120
LosVmSpace * newSpace
新虚拟空间
Definition: los_load_elf.h:121
UINTPTR stackTop
栈底位置,递减满栈下,stackTop是高地址位
Definition: los_load_elf.h:110
函数调用图:
这是这个函数的调用关系图: