Linux内核 fork 源码分析
内核版本:linux-4.4.18
源码位置:这里
fork相关的代码最终执行的函数为_do_fork(),下面按照顺序分析下_do_fork():
- 首先判断是否需要trace(跟踪)这个进程,这一步主要与调试相关,
GDB在x86-64 Linux 系统上的原理就是利用ptrace(2)系统调用 [1]。- 有关
likely和Unlikely,实际上是利用gcc内置函数对分支条件的优化 [2]。
if (likely(!ptrace_event_enabled(current, trace))) // likely表示大多数情况下下面分支会被执行
trace = 0;
- 有关
接着代码调用
copy_process(),它设置了进程描述符以及子进程所需的任何其他内核数据结构。- 它的参数和
_do_fork()相比增加了一个子进程的pid。 - 接下来检查clone_flags参数中传递的标志是否兼容。
- 通过调用
security_task_create()来执行额外的安全检查。 调用dup_task_struct(),为新进程创建新的内核堆栈,thread_info和task_struct结构。
- 执行
alloc_task_struct_node()获得新进程的task_struct结构,并将其地址存储在tsk局部变量中。 - 执行
alloc_thread_info_node()获得一个空闲的内存区域来存储新进程的thread_info结构。 - 执行
arch_dup_task_struct()将父进程的信息复制到tsk变量中,实际上是调用memecpy(),然后将tsk->stack设置为ti。 - 将当前的
thread_info描述符的内容复制到tsk->stack所指向的结构中。 atomic_set(&tsk->usage, 2),usage字段表示task_struct的引用计数[3]。
- 执行
ftrace_graph_init_task()初始化ftrace,内核追踪函数调用。rt_mutex_init_task()初始化锁。copy_creds(p, clone_flags)拷贝父进程的信号。if (nr_threads >= max_threads)检查当前用户的最大线程数是否大于max_threadPF_SUPERPRIV标志判断此任务是否使用超级用户权限,PF_FORKNOEXEC表示进程没有调用exec。- 调用
init_sigpending()来清除挂起的信号。 - 调用
sched_fork()来分割父子进程之间的剩余时间片,将子进程状态置为TASK_RUNNING,代码见这里。 - 接下来拷贝所有的进程信息(files、fs、sighand、signal、mm、namespaces、io、thread_tls)。
alloc_pid()分配新的Pid。copy_thread_tls()函数里面将寄存器%ax置为0,也是子进程pid返回0的原因,代码点这里。- 做一些清理等工作,返回task_struct
- 它的参数和
如果返回值没有错误,调用
wake_up_new_task将进程插入运行队列,此时状态为TASK_RUNNING。如果指定了
CLONE_VFORK标志,它会先让子进程运行。返回子进程的pid。
参考文献
[1] GDB的基本工作原理
[2] 关于likely()与unlikely函数
[3] Understanding the structure task_struct
Linux内核 fork 源码分析的更多相关文章
- Linux 内核网桥源码分析
Linux网桥源码的实现 转自: Linux二层网络协议 Linux网桥源码的实现 1.调用 在src/net/core/dev.c的软中断函数static void net_rx_action(st ...
- linux调度器源码分析 - 运行(四)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 之前的文章已经将调度器的数据结构.初始化.加入进程都进行了分析,这篇文章将主要说明调度器是如何在程序稳定运 ...
- linux调度器源码分析 - 初始化(二)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 上期文章linux调度器源码分析 - 概述(一)已经把调度器相关的数据结构介绍了一遍,本篇着重通过代码说明 ...
- Linux进程调度与源码分析(二)——进程生命周期与task_struct进程结构体
1.进程生命周期 Linux操作系统属于多任务操作系统,系统中的每个进程能够分时复用CPU时间片,通过有效的进程调度策略实现多任务并行执行.而进程在被CPU调度运行,等待CPU资源分配以及等待外部事件 ...
- linux调度器源码分析 - 概述(一)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 调度器作为操作系统的核心部件,具有非常重要的意义,其随着linux内核的更新也不断进行着更新.本系列文章通 ...
- Linux进程调度与源码分析(一)——简介
本系列文章主要是近期针对Linux进程调度源码进行阅读与分析后的经验总结,分析过程中可能结合部分Linux网络编程的相关知识以便于理解,加深对Linux进程调度的理解和知识分享. 本系列文章主要结合L ...
- Linux进程调度与源码分析(三)——do_fork()的实现原理
用户层的fork(),vfork(),clone()API函数在执行时,会触发系统调用完成从用户态陷入到内核态的过程,而上述函数的系统调用,最终实现都是通过内核函数do_fork()完成,本篇着重分析 ...
- Linux network namespace源码分析
一.network namespace的创建 在对iproute2的源码进行分析后,我们可以知道,当我们调用命令`ip netns add ns1`时,本质上就是调用`unshare(CLONE_NE ...
- PHP7内核:源码分析的环境与工具
本文主要介绍分析源码的方式,其中包含环境的搭建.分析工具的安装以及源码调试的基本操作. 一.工具清单 PHP7.0.12 GDB CLion 二.源码下载及安装 $ wget http://php.n ...
随机推荐
- ecshop后台设置模板的地方显示自己新建模板的操作界面
我建立了一个叫test.dwt文件怎样在后台设置模板里面出现呢.1首先找到ecshop目录下的languages\zh_cn\admin/template.php 这个php文件 当然如果这只是简体中 ...
- Jenkins持续集成体系 | 最完整的介绍及资料
这篇文章是来给大家普及Jenkins知识的, Jenkins能解决什么问题, 有哪些应用场景, 为何要掌握Jenkins, 掌握Jenkins后有哪些好处, 弄懂Jenkins需要掌握哪些知识 不知道 ...
- Hive——安装以及概述
一.hive的安装 注意:安装hive的前提要安装好MySQL和Hadoop Hadoop安装:https://www.cnblogs.com/lmandcc/p/15306163.html MySQ ...
- .NET 5 WPF 调用OCX 经验分享
在.Net 5.0 WPF中调用OCX步骤如下: 1,用工具先把ocx转换成AxInterop.EloamViewLib.dll和Interop.EloamViewLib.dll.(这里是我用到的oc ...
- vue-混入( mixin 更方便的组件功能复用方法)的使用
前言 vue 中组件完成了样式和功能的综合复用,通过自定义指令完成了一部分功能的复用,本文总结一下混入在vue项目开发中提供的非常便利的功能复用. 正文 1.混入的分类 (1)全局混入 <div ...
- 使用Stargate访问K8ssandra,Springboot整合Cassandra
1 简介 之前我们在文章<K8ssandra入门-详细记录在Linux上部署K8ssandra到Kubernetes>成功地在Ubuntu上安装了K8ssandra,现在我们来看看如何访问 ...
- 由于坏块导致DG的mrp0进程中断
由于坏块导致DG的mrp0进程中断1.Environment11.2.0.4 ADG 2.SymptomsDG的mrp0进程中断,重启后,还是卡住.查看alert,在1.47存在报错,进一步查看trc ...
- 左手IRR,右手NPV,掌握发家致富道路密码
智能手机的普及让世界成为了我们指尖下的方寸之地. 在各种信息爆炸出现的同时,五花八门的理财信息与我们的生活越贴越近.投资不再仅仅是企业行为,对于个人而言,也是很值得关注的内容. 但是落脚到很小的例子之 ...
- 几何 三垂模型 及 正方形 及 弦图 及 jio拉jio模型 及 中位线
Q:$AO\bot OB,AO=OB,CO\bot OD,CO=OD,BC\bot EF$ 求证 $E$ 为 $AD$ 中点 A:作如图 $AI\bot IH\bot HD$ $\because AO ...
- 如何做好 NodeJS 框架选型?
作为一个有一定工作经验的工程师,工作中经常会遇到技术选型的问题.比如当我们在工作中需要使用到 NodeJS 时,第一个要解决的问题就是如何选择一个合适的框架. 不同的框架有不同的特点,如果我们仅仅从框 ...