2020-2021-1 20209329 《Linux内核原理与分析》第八周作业

作业信息

这个作业属于哪个课程 <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函数只是用了一个全新的程序替换了当前进程的正文、数据段和堆栈段。

posted @ 2020-11-28 20:08  不冷惊喜  阅读(101)  评论(0编辑  收藏  举报