39
社区成员




目录
在实验楼的终端中执行以下命令,发现test.c文件中新增“exec”命令:
cd LinuxKernel
rm -rf menu
git clone https://github.com/mengning/menu.git
# 克隆失败执行该命令
# git config --global http.sslVerify false
cd menu
mv test_exec.c test.c
vi test.c
返回menu文件夹 ,编译运行
make roofs
查看exec函数实现:
可以看到,Exec函数使用了fork()和execlp()等系统调用。
总体来说,这个函数创建了一个子进程,并在子进程中执行了一个名为"/hello"的程序。父进程等待子进程执行完毕后才继续执行。
回退到父目录,使用下面的命令启动内核并在CPU运行代码前停下以便调试:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
打开一个新的终端窗口,依次使用下面的命令启动gdb调试:
gdb
file linux-3.18.6/vmlinux
target remote:1234
在系统调用sys_execve的入口处设置断点:
b sys_execve
继续运行程序,在QEMU窗口中输入exec,系统就会停在上面设置的断点处:
继续设置以下断点,可完整跟踪进程的创建和启动代码:
b load_elf_binary
b start_thread
exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件,如果不是可以执行的文件,那么就解释成为一个shell文件,shell执行。当Linux内核或程序使用fork函数创建子进程后,子进程往往要调用一种exec函数(exec家族的一种)以执行另一个程序;在调用一种exec函数时,该进程执行的程序完全被替换为新程序,而新程序则从其main函数处开始执行,因为调用exec函数并不创建新进程,所以前后的进程ID并未改变,或者说exec函数只是用了一个全新的程序替换了当前进程的正文、数据段和堆栈段