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

这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第七周作业>
这个作业的目标 <分析Linux内核创建一个新进程的过程>
作业正文 本博客链接

实验过程

给MenuOS添加一个fork命令,该命令调用了linux内核中的fork系统调用。

相应的fork调用如上。
修改相应的Makefile文件,使得qemu得以调试:

开启相应的gdb调试:

相应的对以下函数设置断点:

b sys_clone
b do_fork
b dup_task_struct
b copy_process
b copy_thread
b ret_from_fork

进入调试:

分析

Linux中创建进程有三个函数:

fork       //创建子进程。
clone      //主要用于创建线程。
vfork      //与fork类似,但是父子进程共享地址空间,而且子进程先于父进程运行

Linux中创建进程一共有三个函数:fork,创建子进程 vfork,与fork类似,但是父子进程共享地址空间,而且子进程先于父进程运行。 clone,主要用于创建线程。Linux中所有的进程创建都是基于复制的方式,Linux通过复制父进程来创建一个新进程,通过调用do_ fork来实现。然后对子进程做一些特殊的处理。而Linux中的线程,又是一种特殊的进程。根据代码的分析,do_ fork中,copy_ process管子进程运行的准备,wake_ up_ new_ task作为子进程forking的完成。fork()函数最大的特点就是被调用一次,返回两次。
do_fork大概做了这么几件事情:
(1)调用copy_process,将当期进程复制一份出来为子进程,并且为子进程设置相应地上下文信息。
(2)初始化vfork的完成处理信息(如果是vfork调用)
(3)调用wake_up_new_task,将子进程放入调度器的队列中,此时的子进程就可以被调度进程选中,得以运行。
(4)如果是vfork调用,需要阻塞父进程,直到子进程执行exec。
状态以及之间的转换关系如图所示:

原文地址:https://www.cnblogs.com/yanzs/p/14017854.html