浅析内核中用户进程的创建

本文深入探讨Linux内核如何创建用户进程,重点解析`copy_process()`和`wake_up_new_task()`函数。`copy_process()`涉及标志检查、task_struct结构的创建、资源拷贝等步骤,确保子进程安全独立;`wake_up_new_task()`则负责将新进程加入执行队列。通过理解这些机制,可以更好地了解Linux内核的进程管理。
摘要由CSDN通过智能技术生成
  进程创建是一个非常复杂的过程,涉及到很多的技术细节,以及与内核中的很多子系统的交互等,要完整的讨论到各种情况不太可能,这里只以用户空间调用fork()创建进程为例来进行讨论。
  fork()系统调用对应的内核实现为sys_fork(),sys_fork()是对do_fork()的简单封装,sys_fork()的任务是从处理器寄存器中提取由用户空间提供的信息,do_fork()负责进程的复制。fork()和clone()系统调用的入口点sys_vfork()和sys_clone()也是调用的do_fork()。

  do_fork()函数中主要的处理流程如下所示(引自《深入Linux内核架构》):


  我们关注的是用户进程的创建,所以这里只关注copy_process()和wake_up_new_task()这两个函数。
  copy_process()函数有7个参数,其中我们需要关心的有clone_flags、stack_start和regs。cone_flags是一个标志集合,分为两部分:最低的字节指定了在子进程终止时发送给父进程的信号,其余的高位字节保存了各种真正的复制标志,如CLONE_FS、CLONE_THREAD等。在用户层调用fork()时不能指定标志,所以默认的CLONE_FLAGS的值为SIGCHLD。如果你想要修改默认的创建进程的方式,或者修改子进程退出时的信号,可以使用clone()系统调用(和fork不同,具体参见man clone)。stack_start是父进程(也就是current)的用户栈的起始地址。regs是一个指向寄存器集合的指针,该参数使用的数据类型是特定于体系结构的struct pt_regs。
  现在我们来看copy_process()是创建子进程的。
1、标志检查
  copy_process()首先会检查clone_flags中指定的标志是否冲突以及安全检查,创建用户进程时只有SIGCHLD,所以这个检查是肯定没有问题的。
2、dup_task_struct()
  我们知道Linux内核中使用task_struct结构来表示进程,子进程的描述符结构是在du_task_struct()中创建的,其源码实现如下:

static struct task_struct *dup_task_struct(struct task_struct *orig)
{
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值