文章目录

  • 一、fork 系统调用源码
  • 二、vfork 系统调用源码
  • 三、clone 系统调用源码
  • 四、_do_fork 函数源码
  • 五、do_fork 函数源码

Linux 进程相关 " 系统调用 " 对应的源码在 linux-5.6.18\kernel\fork.c 源码中 , 下面开始对该源码的相关 " 系统调用 " 进行分析 ;

一、fork 系统调用源码


fork() 系统调用函数 , 最终返回的是 _do_fork() 函数执行结果 ;

#ifdef __ARCH_WANT_SYS_FORK
SYSCALL_DEFINE0(fork)
{#ifdef CONFIG_MMUstruct kernel_clone_args args = {.exit_signal = SIGCHLD,};return _do_fork(&args);
#else/* can not support in nommu mode */return -EINVAL;
#endif
}
#endif

二、vfork 系统调用源码


vfork() 系统调用函数 , 最终返回的是 _do_fork() 函数执行结果 ;

#ifdef __ARCH_WANT_SYS_VFORK
SYSCALL_DEFINE0(vfork)
{struct kernel_clone_args args = {.flags       = CLONE_VFORK | CLONE_VM,.exit_signal  = SIGCHLD,};return _do_fork(&args);
}
#endif

三、clone 系统调用源码


clone() 系统调用函数 , 最终返回的是 _do_fork() 函数执行结果 ;

#ifdef __ARCH_WANT_SYS_CLONE
#ifdef CONFIG_CLONE_BACKWARDS
SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,int __user *, parent_tidptr,unsigned long, tls,int __user *, child_tidptr)
#elif defined(CONFIG_CLONE_BACKWARDS2)
SYSCALL_DEFINE5(clone, unsigned long, newsp, unsigned long, clone_flags,int __user *, parent_tidptr,int __user *, child_tidptr,unsigned long, tls)
#elif defined(CONFIG_CLONE_BACKWARDS3)
SYSCALL_DEFINE6(clone, unsigned long, clone_flags, unsigned long, newsp,int, stack_size,int __user *, parent_tidptr,int __user *, child_tidptr,unsigned long, tls)
#else
SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,int __user *, parent_tidptr,int __user *, child_tidptr,unsigned long, tls)
#endif
{struct kernel_clone_args args = {.flags       = (lower_32_bits(clone_flags) & ~CSIGNAL),.pidfd       = parent_tidptr,.child_tid = child_tidptr,.parent_tid = parent_tidptr,.exit_signal   = (lower_32_bits(clone_flags) & CSIGNAL),.stack        = newsp,.tls       = tls,};if (!legacy_clone_args_valid(&args))return -EINVAL;return _do_fork(&args);
}
#endif

四、_do_fork 函数源码


_do_fork() 函数中 , 调用了 copy_process() 函数 ;

/**  Ok, this is the main fork-routine.** It copies the process, and if successful kick-starts* it and waits for it to finish using the VM if required.** args->exit_signal is expected to be checked for sanity by the caller.*/
long _do_fork(struct kernel_clone_args *args)
{u64 clone_flags = args->flags;struct completion vfork;struct pid *pid;struct task_struct *p;int trace = 0;long nr;/** Determine whether and which event to report to ptracer.  When* called from kernel_thread or CLONE_UNTRACED is explicitly* requested, no event is reported; otherwise, report if the event* for the type of forking is enabled.*/if (!(clone_flags & CLONE_UNTRACED)) {if (clone_flags & CLONE_VFORK)trace = PTRACE_EVENT_VFORK;else if (args->exit_signal != SIGCHLD)trace = PTRACE_EVENT_CLONE;elsetrace = PTRACE_EVENT_FORK;if (likely(!ptrace_event_enabled(current, trace)))trace = 0;}p = copy_process(NULL, trace, NUMA_NO_NODE, args);add_latent_entropy();// ...return nr;
}

五、do_fork 函数源码


do_fork() 函数有 555 个参数 ,

unsigned long clone_flags 参数表示 创建进程 的 标志位 集合 ;

unsigned long stack_start 参数表示 用户空间 栈 起始地址 ;

unsigned long stack_size 参数表示 用户空间 栈 大小 , 通常为 000 ;

int __user *parent_tidptr 参数表示 指向 用户空间 地址的指针 , 该指针指向 父进程 的进程号 ;

int __user *child_tidptr 参数表示 指向 用户空间 地址的指针 , 该指针指向 子进程 的进程号 ;

#ifndef CONFIG_HAVE_COPY_THREAD_TLS
/* For compatibility with architectures that call do_fork directly rather than* using the syscall entry points below. */
long do_fork(unsigned long clone_flags,unsigned long stack_start,unsigned long stack_size,int __user *parent_tidptr,int __user *child_tidptr)
{struct kernel_clone_args args = {.flags       = (lower_32_bits(clone_flags) & ~CSIGNAL),.pidfd       = parent_tidptr,.child_tid = child_tidptr,.parent_tid = parent_tidptr,.exit_signal   = (lower_32_bits(clone_flags) & CSIGNAL),.stack        = stack_start,.stack_size  = stack_size,};if (!legacy_clone_args_valid(&args))return -EINVAL;return _do_fork(&args);
}
#endif

【Linux 内核】进程管理 ( 进程相关系统调用源码分析 | fork() 源码 | vfork() 源码 | clone() 源码 | _do_fork() 源码 | do_fork() 源码 )相关推荐

  1. 【Linux 内核 内存管理】mmap 系统调用源码分析 ④ ( do_mmap 函数执行流程 | do_mmap 函数源码 )

    文章目录 一.do_mmap 函数执行流程 二.do_mmap 函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 & ...

  2. linux 进程管理 ppt,Linux内核结构与进程管理.ppt

    Linux内核结构与进程管理.ppt Linux 内核结构与进程管理,Linux系统结构Linux kernel 开放源代码的linux操作系统内核,目前版本为2.6,Linux内核组成1. 进程调度 ...

  3. Linux内核学习008——进程管理(四)

    Linux内核学习007--进程管理(四) 进程家族树 Unix系统的进程之间存在一个明显的继承关系,所有的进程都是PID为1的init进程的后代.内核在系统启动的最后阶段启动init进程,然后ini ...

  4. linux内核arc4算法,linux内核中与进程相关的数据结构(基于linux-mainline-rc4)

    1.进程描述符 struct task_struct { volatile long state; ....... struct list_head tasks; ....... struct mm_ ...

  5. 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 )

    文章目录 一.进程特殊形式 ( 内核线程 | 用户线程 ) 二.C 标准库与 Linux 内核中进程相关概念 三.Linux 查看进程命令及输出字段解析 一.进程特殊形式 ( 内核线程 | 用户线程 ...

  6. Linux内核之话说进程

    前言 回望笔者之前发的数篇技术博客,中规中矩,阅读量更是不尽人意,看来没帮到多少人,不行,文风要改,要大改.于是乎,笔者金荣摇身一变,化作Linux OS的一个进程,我是一个进程,我来讲述我的故事. ...

  7. 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )

    文章目录 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) 二.内存管理流程 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) " 堆内存 " ...

  8. 【Linux 内核 内存管理】内存管理架构 ① ( 内存管理架构组成 | 用户空间 | 内核空间 | MMU 硬件 | Linux 内核架构层次 | Linux 系统调用接口 )

    文章目录 一.内存管理架构组成 ( 用户空间 | 内核空间 | MMU 硬件 ) 二.Linux 内核架构层次 三.Linux 系统调用接口 一.内存管理架构组成 ( 用户空间 | 内核空间 | MM ...

  9. 【Linux 内核 内存管理】内存映射相关数据结构 ③ ( vm_area_struct 结构体成员分析 | shared 成员 | anon_vma_chain 成员 | anon_vma 成员 )

    文章目录 一.vm_area_struct 结构体成员分析 1.shared 成员 2.anon_vma_chain 成员 3.anon_vma 成员 二.vm_area_struct 结构体完整源码 ...

  10. 修改linux内核达到隐藏进程目的(2.6.28)

    修改linux内核达到隐藏进程目的(2.6.28) 要求: 高级操作系统与分布式系统作业 ps和top命令列出了unix中当前所有进程的相关信息,作业要求在linux中增加两个系统调用,功能如下: h ...

最新文章

  1. 关于BBSxp/LeadBBS的后台上传Webshell的鸡肋防范
  2. Let Me Count The Ways(Kickstart Round H 2018)
  3. DataSet 的 Merge 方法
  4. 什么变量在堆内存里存放,什么变量在栈内存里存放
  5. linux下expdp定时备份_Linux 自动备份 Oracle 数据库 Shell 脚本
  6. html转word 图片丢失 java_Java 实现 Word 转 pdf 文档的工具来了
  7. MongoDB笔记(一):MongoDB介绍及Windows下安装
  8. Unable to round-trip http request to upstream: EOF
  9. 在linux下用C语言编写贪吃蛇小游戏
  10. 出生率新低!1978-2020中国人口出生率、死亡率及自然增长率变迁
  11. 如何给C盘扩容?亲测有效
  12. linux系统硬盘坏了,linux 系统 如何检测 磁盘 是否损坏?
  13. Python Tkinter 之Listbox控件(Python GUI 系列12)
  14. EasyExcel自定义复杂的表头并在同sheet中实现分页
  15. 机器人时代 - 电子书下载(高清版PDF格式+EPUB格式)
  16. 永磁同步电机的标么值系统
  17. WPF: WPF 中的 Triggers 和 VisualStateManager
  18. linux下运行mcnp6安装教程,JBPM6教程-手把手教你安装JBPM
  19. 游戏引擎与游戏开发入门介绍
  20. gost备份linux系统,linux系统GOST备份教程.doc

热门文章

  1. CO-类的本质、description方法
  2. python 模拟抽象类
  3. libjpeg的问题
  4. 使用nginx阻止别人域名绑定到自己的IP上
  5. 一个不错的git学习网站
  6. Java编程中写出好代码的建议
  7. 30个最常用css选择器解析
  8. 后盾网lavarel视频项目---自定义验证和自定义验证规则
  9. ResDepot CRC码
  10. JS原型继承和类式继承