作业信息
这个作业属于哪个课程 | <2020-2021-1Linux内核原理与分析)> |
---|---|
这个作业要求在哪里 | <2020-2021-1Linux内核原理与分析第八周作业> |
这个作业的目标 | <Linux内核如何装载和启动一个可执行程序> |
作业正文 | https://www.cnblogs.com/Alannic/p/14053862.html |
实验:使用gdb跟踪分析一个execve系统调用内核处理函数sys_execve
在实验楼环境中执行以下命令,向MenuOS中增加exec命令。
cd LinuxKernel
rm -rf menu
git clone https://github.com/mengning/menu.git
cd menu
mv test_exec.c test.c
make rootfs
在menu里面输入help命令,查看是否存在exec命令
可见新的文件系统里面已经存在exec命令了。
在shell中输入以下命令
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
水平新建一个shell,输入以下命令利用gdb进行调试
gdb
file linux-3.18.6/vmlinux
target remote:1234
在sys_execve、load_elf_binary、start_thread设置断点:
b sys_execve
b load_elf_binary
b start_thread
退出调试状态后,查看hello的EIF头部信息
readelf -h hello
总结
exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件,如果不是可以执行的文件,那么就解释成为一个shell文件,shell执行。当Linux内核或程序使用fork函数创建子进程后,子进程往往要调用一种exec函数(exec家族的一种)以执行另一个程序;在调用一种exec函数时,该进程执行的程序完全被替换为新程序,而新程序则从其main函数处开始执行,因为调用exec函数并不创建新进程,所以前后的进程ID并未改变,或者说exec函数只是用了一个全新的程序替换了当前进程的正文、数据段和堆栈段。