Linux进程创建过程简析

原创作品转载请注明出处 ,《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

 一、task_struct结构体简要分析

1、进程状态宏定义

可以看一下这幅流程图(来自《Linux kernel development》 )flow

图1. 进程状态的流程图

 2、task_struct部分内容解释

二、系统调用以及do_fork()

sys_fork()、sys_vfork()、sys_clone( )三个系统调用都可以用来创建新的进程,最终都是调用的do_fork()这个函数。

但是在我们的环境中,fork()函数会使用sys_clone() 这个系统调用。

1、一些系统调用

 2、do_fork( )代码分析

 3、copy_process()函数代码

4、dup_task_struct()代码

 

5、copy_thread()

flow222

图4.简单流程图

三、gdb跟踪sys_clone()执行过程

1、在MenuOS中添加新函数

 

2、生成新的根文件系统rootfs

因为老师写好的makefile的原因,所以会和上次一样自动启动qemu虚拟机

3、开始跟踪sys_clone()

实际显示这两个断点并没有成功断下:

sys_fork没有断下图2. sys_fork()没有断下

下面重新设值断点

在虚拟机中运行test_fork之后,虚拟机被暂停了

sys_clone断下图3. sys_clone()被断下

因为博主实在没有时间。。。所以,下面的调试过程基本上没什么有价值的东西。。。

 

四、个人总结

 

这次写博客花的时间确实不少,简直要命。。。因为想多写一点,以后可以参考,所以就对代码做了很多的注释。

Linux进程创建主要就是各种复制,首先复制父进程的大部分资源,甚至是内核堆栈信息,之后才对其进行修改,完成一个新进程信息的准备。最后设置各种堆栈以及寄存器,在ret_from_fork()之后就跳转到了新进程的起始代码处,开始了子进程的生命历程。当然,创建的最后是进程调度的时机,可能发生进程调度。

因为在Linux中没有真正的线程,线程的实现方式只是一种特殊的进程,所以我们一直没有仔细区分二者的差别。

Linux进程的创建实在不是一般的复杂,也不是三言两语能说清楚的,就说这么多了。

 

参考文献:

http://blog.csdn.net/npy_lp/article/details/7292563
http://blog.csdn.net/npy_lp/article/details/7335187

有关进程、线程区别的补充材料:

《Linux 线程实现机制分析》https://www.ibm.com/developerworks/cn/linux/kernel/l-thread/
《关于Linux的进程和线程》http://kenby.iteye.com/blog/1014039

发表评论

电子邮件地址不会被公开。 必填项已用*标注