实验六 分析 Linux 内核创建一个新进程的过程
一、实验原理
1、操作系统内核三大功能是进程管理,内存管理,文件系统,最核心的是进程管理。
2、linux 进程的状态和操作系统原理的描述进程状态有所不同,比如就绪状态和运行状态都是TASK_RUNNING。(这个表示它是可运行的,但是实际上有没有在运行取决于它是否占有 CPU )。
3、fork 被调用一次,能够返回两次。在父进程中返回新创建子进程的 pid;在子进程中返回 0。
4、调用 fork 之后,数据、堆、栈有两份,代码仍然为一份(这个代码段成为两个进程的共享代码段)。当父子进程有一个想要修改数据或者堆栈时,两个进程真正分裂。
二、实验步骤
1、打开实验楼系统,清空原来的menu文件夹,克隆一个新的menu
ls
cd ~/LinuxKernel
rm menu -rf
git clone https://github.com/mengning/menu.git
2、然后将test_fork.c文件改为test.c用以测试,再make一下,保证更新过
cd menu
mv test_fork.c test.c
make rootfs
3、正常运行,输入help命令,发现可以使用fork函数
4、退出qemu界面,返回上衣文件夹LinuxKernel,输入qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s让MenuOs停下方便调试
5、打开另一个终端窗口进行gdb调试
6、正常连接内核后设置六个断点sys_clone、do_fork、dup_task_struct、copy_process、copy_thread、ret_from_fork
7、按c继续运行可得如下结果
三、实验总结
1、fork函数
库函数fork是用户态创建一个子进程的系统调用,实际上fork系统调用把当前进程又复制了一个子进程,也就是一个进程变成了两个进程,两个进程执行相同的代码,只是fork系统调用在父进程和子进程中的返回值不同。但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
2、do_fork
do_fork()主要完成了调用copy——process()复制父进程信息、获得pid、调用wake_up_new_task将子进程加入调度器队列等待获得分配CPU资源运行、通过clone_flags标志做一些辅助工作,其中copy_process()是创建一个进程内容的主要的代码