我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何分析Linux内核源码do_fork

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何分析Linux内核源码do_fork

本篇文章为大家展示了如何分析Linux内核源码do_fork,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

我们都知道进程是Linux内核中最为重要的一个抽象概念,那么我们平时在fork一个进程时,该进程究竟是怎么产生的呢?

推送会浅谈一下在进程创建过程中扮演着重要角色的do_fork函数。

内核如何来抽象一个进程

内核通过一个叫做task_struct的结构体来抽象一个进程,该结构体的定义(以内核2.6为例)在include/linux.sched.h中。

截取部分task_struct如下:

如何分析Linux内核源码do_fork

上述task_struct属性是我节选出的部分其结构体中的属性,我们从中可以大致了解到标识一个进程的属性大致会有该用以表示该进程所处的状态,进程的标志,以及进程是否被其他进程跟踪,进程锁的深度,进程的优先级,进程的pid,进程的父母,进程的孩子链表,进程所打开的文件描述符表,进程所处的文件系统,进程的信号。。。。等等一堆我们平时可能遇到的和进程相关的东西。

do_fork简单分析 

接触linuxC编程的人都知道,创建一个进程我们需要调用fork函数,fork其实又是调用了clone函数来实现的,而clone函数中最关键的函数就是do_fork函数。

在分析do_fork前我们脑海中可以大致想象一下,进程究竟是如何被创建出来的,假如让你来创建一个进程你会咋么做?

我们可以这样去分析,既然原来的进程被抽象成一个task_struct,那么新进程也是一个task_struct只不过它里面的一些属性会不同与原来的task_struct,那么创建一个新进程所要做的工作就是赋值一个与原来进程一样都的task_struct结构,然后然后将新进程的task_struct不同于原来task_struct的属性进行修改即可。

do_fork定义在kernel/fork.c文件中。

在分析该函数之前我们先来分析一下它的函数的各个参数。

参数如下: 

如何分析Linux内核源码do_fork

clone_flags:该参数是此函数中最重要的一个参数,该值中的每个位都代表对子进程task_struct中的每种属性的设置;

stack_start:子进程用户态堆栈的开始地址;

regs:当系统发生系统调用时,需从用户态切换到内核态,此结构体用来保存此时用户态进程中的通用寄存器中的值,并被存放在内核态堆栈中;

stack_size:目前未被使用,通常设为0;

parent_tidptr:父进程在用户态下pid的地址;

child_tidptr:子进程在用户态下pid的地址;

其中clone_flags的标志位宏定义如下: 

如何分析Linux内核源码do_fork

举个简单的例子当我们的参数中设置了CLONE_VM这个宏,那么就以为这我们新创建的进程和其父进程要共享VM,当我们设置了CLONE_FILES时意味这父子进程之间共享打开的文件描述符。

do_fork开始执行后首先做的就是为子进程定义一个新的task_struct指针:

struct task_struct *p;

在下来会检查一些clone_flags所不允许的位组合,例如:

if (clone_flags & CLONE_NEWUSER) {  if (clone_flags & CLONE_THREAD)  return -EINVAL;  }

上述中不允许同时既设置了CLONE_NEWUSER标志,还设置CLONE_THREAD标志,这样就会产生错误。

类似上面当一系列的安全检查完毕之后,copy_process函数就登场了,copy_process函数工作流程具体如下:

1)调用dup_task_struct函数为新的进程创建一个内核栈,thread_info结构和task_struct等,当然此时的值都是和父进程完全一样的

dup_task_struct函数定义如下:

如何分析Linux内核源码do_fork

如何分析Linux内核源码do_fork

2)检查并确保新创建该子进程后,当前用户所拥有的进程数没有超出给它分配的资源限制,代码如下: 

如何分析Linux内核源码do_fork

3)子进程着手使自己与父进程区别开来,从父进程那继承过来的许多属性都要被清0或设置一个初始值,但task_struct中的大多数数据还是未被修改,部分代码如下:

如何分析Linux内核源码do_fork

如何分析Linux内核源码do_fork 

4)给子进程分配一个CPU,代码如下:

sched_fork(p, clone_flags);

5) 接着就是子进程拷贝父进程的一些资源,具体如下,调用copy_files函数拷贝父进程打开的文件描述符:  

如何分析Linux内核源码do_fork

调用copy_fs继承父进程所属的文件系统。 

如何分析Linux内核源码do_fork

调用copy_signal函数拷贝并设置新的signal_struct,signal_struct包含了大量的进程运行的信息,调用copy_mm函数处理与新进程的内存问题。 

如何分析Linux内核源码do_fork

调用copy_io函数拷贝父进程的I/O情况:

如何分析Linux内核源码do_fork 

还有调用copy_namespaces 和 copy_thread等,这里就不在赘述。

6)调用alloc_pid为新进程分配一个pid。

pid = alloc_pid(p->nsproxy->pid_ns);

7)copy_process做一些收尾工作,并返回新进程的task_struct指针,此时再次回到了do_fork,新创建的子进程被唤醒,并让其先投入运行。

如何分析Linux内核源码do_fork 

总结

关于进程创建的源码理解,我感觉主要抓住俩点即可。***进程被内核抽象成了啥?它的数据结构是咋样的(task_struct)这点我们必须有所认识,第二创建进程最主要的其实就是拷贝父进程的task_struct里的属性,但是关键点是拷贝哪些,哪些又是子进程和父进程所不同的,很简单我们只需要把握住进程创建函数里的clone_flags参数就可以知道怎么拷贝了。

上述内容就是如何分析Linux内核源码do_fork,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何分析Linux内核源码do_fork

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何分析Linux内核源码do_fork

本篇文章为大家展示了如何分析Linux内核源码do_fork,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我们都知道进程是Linux内核中最为重要的一个抽象概念,那么我们平时在fork一个进程时,该
2023-06-16

Android内核wake_up源码分析

今天小编给大家分享一下Android内核wake_up源码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。内核中通常用法:
2023-07-05

linux内核中list链表的源码分析

这篇文章将为大家详细讲解有关linux内核中list链表的源码分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。linux kernel里的很多数据结构都很经典, list链表就是其中之一,
2023-06-06

如何让Linux内核源码规范

如何让Linux内核源码规范,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。从编码风格错误开始曾经在开发Linux内核驱动的时候,创建了一个补丁文件,但是在把补丁
2023-06-15

分析Linux内核调度器源码之初始化

目录一、导语二、调度器的基本概念2.1、运行队列(rq)2.2、调度类(sched_class)2.3、调度域(sched_domain)2.4、调度组(sched_group)2.5、根域(root_domain)2.6、组调度(grou
2022-06-03

Linux内核编码风格分析

这篇文章主要介绍了Linux内核编码风格分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux内核编码风格分析文章都会有所收获,下面我们一起来看看吧。为什么要竖向对齐代码?举一个简单的例子:int rob
2023-06-17

Linux系统中如何分析内核

本篇文章给大家分享的是有关Linux系统中如何分析内核,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在Linux系统中,内核是一个很重要的部分,属于Linux系统中的核心程序。
2023-06-28

如何分析linux系统内核bsp

这期内容当中小编将会给大家带来有关如何分析linux系统内核bsp,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。BSP简介:Board Support Package顾名思义,就是板级支持包,说白了就是最
2023-06-28

Linux内核网络协议栈源码剖析

Linux内核网络协议栈是一个非常庞大和复杂的软件系统,涉及到很多不同的模块和功能。以下是一个大致的剖析步骤:1. 网络协议栈的初始化:从内核启动开始,网络协议栈的初始化是一个非常重要的步骤。在这个过程中,会初始化各种网络协议的数据结构,如
2023-09-23

如何分析Linux内核双向链表

这篇文章将为大家详细讲解有关如何分析Linux内核双向链表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Linux中双向链表是指将双向链表节点嵌套在其它的结构体中;在遍历链表的时候,根据双链
2023-06-28

Linux五大模块内核源码以及内核整体架构设计的示例分析

小编给大家分享一下Linux五大模块内核源码以及内核整体架构设计的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、前言本文是“Linux内核源码分析”系
2023-06-29

如何分析Linux内核SCSI IO子系统

如何分析Linux内核SCSI IO子系统,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。概述LINUX 内核中 SCSI 子系统由 SCSI 上层,中间层和底层驱动模块 [
2023-06-17

Fedora内核源码如何安装Kernel

这篇文章主要介绍Fedora内核源码如何安装Kernel,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Fedora内核源码经过长时间的发展,很多用户对Fedora 8 都很了解了,这里我发表一下个人理解,和大家讨论讨
2023-06-17

PHP底层内核源码之变量的示例分析

小编给大家分享一下PHP底层内核源码之变量的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!PHP变量的四个基本特征:1.变量命名变量命名上,PHP继承了P
2023-06-15

PHP底层内核源码之变量zend_string的示例分析

这篇文章主要介绍PHP底层内核源码之变量zend_string的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!我们主要通读了_zval_struct 来深入了解 PHP7以上版本的 变量实现和内存占用str
2023-06-15

openSUSE如何给内核源代码打补丁

小编给大家分享一下openSUSE如何给内核源代码打补丁,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!内核源码升级可能使某个补丁失效,所以并不是一个补丁可以"补"
2023-06-16

Java+Linux内核源码之如何理解多线程之进程

这篇文章主要讲解了“Java+Linux内核源码之如何理解多线程之进程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java+Linux内核源码之如何理解多线程之进程”吧!Linux 内核如
2023-06-15

如何分析Linux系统内核的作用和功能

这篇文章主要为大家分析了如何分析Linux系统内核的作用和功能的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“如何分析Linux系统内核的作用和功能”的知识吧
2023-06-28

如何用源码分析在linux上的safe point

这篇文章将为大家详细讲解有关如何用源码分析在linux上的safe point,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。safe point 顾明思意,就是安全点,当需要jvm做一些操作
2023-06-17

编程热搜

目录