实验七 Linux 内核如何装载和启动一个可执行程序
目录
3. 使用以下命令,qemu暂停,再打开一个新的终端进行gdb调试
一、实验内容
1.打开实验楼,打开终端输入以下命令er
cd ~/LinuxKernel
rm menu -rf
git clone https://github.com/mengning/menu.git
cd menu
mv test_exec.c test.c
make rootfs
2.在test文件中查看exec函数
3. 使用以下命令,qemu暂停,再打开一个新的终端进行gdb调试
cd ../
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
对sys_execve,load_elf_binary,start_thread进行断点调试
4.使用以下命令查看hello的ELF头部
redelf -h hello
二、总结
当sys_execve()系统调用从内核态返回到用户态时,EIP寄存器直接跳转到ELF程序的入口地址。
execve和fork都是特殊一点的系统调用:一般的都是陷入到内核态再返回到用户态。fork父进程和一般进程调度一样,子进程返回到一个特定的点ret_from_fork,子进程是从ret_from_fork开始执行然后返回到用户态。execve特殊:执行到可执行程序–陷入内核–构造新的可执行文件–覆盖掉原可执行程序–返回到新的可执行程序,作为起点(也就是main函数) ,需要构造他的执行环境。