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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux内核学习之六 进程创建过程学习相关的知识,希望对你有一定的参考价值。

一 关于linux进程概念的补充

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

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

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

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

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

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

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

 二 调试

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

技术分享

 

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

技术分享

 

设置断点:

技术分享

 

程序停在第一个断点处:

技术分享

模拟器显示:

技术分享

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

技术分享

模拟器显示:

技术分享

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

技术分享

第四个断点:

技术分享

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

三 分析总结

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

技术分享

自己的理解:

    首先用户空间应用程序执行创建进程的系统调用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

以上是关于linux内核学习之六 进程创建过程学习的主要内容,如果未能解决你的问题,请参考以下文章

linux内核学习之三 跟踪分析内核的启动过程

实验六———分析Linux内核创建一个新进程的过程

(笔记)Linux内核学习之进程调度

linux学习之进程篇

Linux内核分析:实验六--Linux进程的创建过程分析

实验六:分析Linux内核创建一个新进程的过程