原创作品转载请注明出处 +《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
一、实验要求
根据本周所学知识分析fork函数对应的系统调用处理过程
二、实验内容
阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235;
分析fork函数对应的内核处理过程sys_clone,理解创建一个新进程如何创建和修改task_struct 的数据结构;
使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone ,验证您对Linux系统创建一个新进程的理解,推荐在实验楼Linux虚拟机环境下完成实验。
特别关注新进程是从哪里开始执行的?为什么从哪里能顺利执行下去?即执行起点与内核堆栈如何保证一致。
三、实验环境
本地linux环境(ubuntu14.04 64bit)
主要优点:使用方便,方便保存,不受网络影响。
四、实验过程
1. 在本地搭建环境
以前都是在虚拟机上完成的实验,这次就在本地搭建了实验环境,大部分过程参考孟老师的教程。
为了方便查看,特在此将完整过程写下,使用自己的Linux系统环境搭建MenuOS的过程:
# 下载内核源代码编译内核
cd ~/LinuxKernel/
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
xz -d linux-3.18.6.tar.xz
tar -xvf linux-3.18.6.tar
cd linux-3.18.6
make i386_defconfig
make # 一般要编译很长时间,少则20分钟多则数小时
# 制作根文件系统
cd ~/LinuxKernel/
mkdir rootfs
git clone https://github.com/mengning/menu.git # 如果被墙,可以使用附件menu.zip
cd menu
gcc -o init linktable.c menu.c test_fork.c -m32 -static –lpthread
cd ../rootfs
cp ../menu/init ./
find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
# 启动MenuOS系统
cd ~/LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
注意:
制作根文件系统,如果你的系统是新安装的,那么很可能就无法制作成功,会出现错误
/usr/include/features.h:374:25:
fatal error: sys/cdefs.h: No such file or directory
原因很简单,就是因为缺少c/c++的函数库。运行下面两句代码,完成库的安装
sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib
2.启动MenuOS
打开shell终端,执行以下命令:
cd LinuxKernel
rm -rf menu
git clone https://github.com/mengning/menu.git
cd menu
mv test_fork.c test.c
make rootfs
3.调试MenuOS
通过增加-s -S启动参数打开调试模式
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
设置断点
b sys_clone
b do_fork
b dup_task_struct
b copy_process
b copy_thread
b ret_from_fork