linux内核学习之六 进程创建过程学习

时间:2022-04-28 16:46:38

一 关于linux进程概念的补充

关于进程的基本概念这里不多说,把自己的学习所得作一些补充:

1. 在linux内核中,系统最多可以有64个进程同时存在。

2.linux进程包含的关键要素:一段可执行的程序;专用的系统堆栈空间;内核中它的控制块(进程控制块);独立的存储空间。

3. 系统的第一个进程由系统初始化生成。

4. 内核通过一个唯一的进程标识号PID来标识每个进程。

5. 用数据结构task_struct表示一个进程,包括进程的属性和状态。task_struct 结构中的指向前后进程的指针形成了task数组。

6. 当新进程生成时,linux为新进程分配一个task_struct结构,然后将指针保存在task数组中。

二 调试

  在前次实验的基础上,添加代码如下:

linux内核学习之六  进程创建过程学习

在menuos中运行结果,可以看到添加了fork命令:

linux内核学习之六  进程创建过程学习

设置断点:

linux内核学习之六  进程创建过程学习

程序停在第一个断点处:

linux内核学习之六  进程创建过程学习

模拟器显示:

linux内核学习之六  进程创建过程学习

继续运行,程序停在第二个断点处:

linux内核学习之六  进程创建过程学习

模拟器显示:

linux内核学习之六  进程创建过程学习

接着运行,停在第三个断点处:

linux内核学习之六  进程创建过程学习

第四个断点:

linux内核学习之六  进程创建过程学习

最后结果如上面的第二张图,不重复了。在menuos中命令行的方式输入fork,没有立即显示结果,在gdb中多次输入”c“后,打印pid信息。

三 分析总结

先附上一张自己理解的流程图:

linux内核学习之六  进程创建过程学习

自己的理解:

首先用户空间应用程序执行创建进程的系统调用fork(),vfork(),clone(),然后切换到内核空间(具体过程可见以前的博客),对于创建进程,内核都是执行的do_fork(),在do_fork()函数中调用函数copy_process(),该函数创建进程描述符以及子进程执行所需要的其他数据结构,初步复制父进程的信息如堆栈。但是子进程是从哪里开始执行的?从分析代码可知(p->thread.ip = (unsigned long) ret_from_fork;),子进程是从ret_from_fork标志处开始执行,在ret_from_fork 的末端执行了syscall_exit,结合上次的学习可知,该标志标识了从内核空间返回到内核空间过程。至此完成了fork()创建进程的过程。(细节还有待了解。。。)

by:方龙伟

原创作品 转载请注明出处

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000