linux内核分析第七次实验
实验:
rm menu -rf
git clone https://github.com/megnning/menu.git
cd menu
ls
mv test_exec.c test.c
vi test.c // 可以看到增加了一个exec的程序,只比fork程序多了一个execlp
vi Makefile // 查看Makefile的更改,加入了hello
make rootfs
先设置sys_execve后,在menuOS里执行系统调用exec,会停在如图所示代码,找到第一个断点
sys_execve的内部处理过程
-
系统调用的入口:do_execve
return do_execve(getname(filename), argv, envp);
-
转到do _ execve _ common函数
return do_execve_common(filename, argv, envp); file = do_ open_exec(filename);//打开要加载的可执行文件,加载它的文件头部。 bprm->file = file; bprm->filename = bprm->interp = filename->name; //创建了一个结构体bprm,把环境变量和命令行参数都copy到结构体中;
-
exec_binprm:
ret = search_binary_handler(bprm);//寻找此可执行文件的处理函数 在其中关键的代码: list_for_each_entry(fmt, &formats, lh); retval = fmt->load_binary(bprm); //在这个循环中寻找能够解析当前可执行文件的代码并加载出来 //实际调用的是load_elf_binary函数
- 文件解析相关模块:核心的工作就是把文件映射到进程的空间,对于ELF可执行文件会被默认映射到0x8048000。
-
需要动态链接的可执行文件先加载链接器ld(load _ elf _ interp 动态链接库动态链接文件),动态链接器的起点。如果它是一个静态链接,可直接将文件地址入口进行赋值。