您现在的位置是:首页 > 正文

fork源码分析

2024-02-01 06:40:24阅读 2

fork的整体流程

  1. 当用户空间的代码调用fork的时候,产生0x80号中断。(此时用户空间的程序阻塞,保存用户空间的上下文信息,进入内核程序)
  2. system_call处理0x80号中断程序,获取用户空间通过寄存器带来的系统调用号
  3. 内核程序通过系统调用号,调用对应的系统调用函数sys_fork()
  4. sys_fork()底层通过do_fork()实现,调用内核代码do_fork()
  5. 首先do_fork()向系统申请一个pid,标识新产生的子进程
    (pid 的最大值32768 开始申请时在当前进程的最大的pid的基础上加一,
    当超过最大值的时候,从开始设置的起始位置找第一个可以使用的pid)
  6. 分配进程的pcb块
    slab 分配器会为内核中经常用到的一些数据结构构造专用的高速缓存区,使得提高内存的分配效率
    alloc_task_struct(); 宏可以申请一个pcb块大小的内存块
  7. 分配内核栈 thread_info
    在task_struct结构体中,有一个指针指向一块内核栈的空间,这块空间中存储着内核进程的调用信息
  8. 复制父进程的pcb块与内核栈的信息
    *ti = *orig->thread_info; //将父进程的进程的描述信息复制到新申请的thread_info结构体中
    *tsk = *orig; //父进程的pcb块复制到新申请的task_struct结构体中,该复制属于浅拷贝,所以要有前一句的复制过程
    tsk->thread_info = ti; //新申请的pcb块中的thread_info 指向新申请的内核栈
    ti->task = tsk; //新申请的内核栈中的task指针指向新申请的pcb块
  9. 保存新进程的pid
    在 task_struct 中的pid的值设置为刚刚申请的pid的值
  10. 复制父进程的各种信息
		/**
		 * copy_semundo,copy_files,copy_fs,copy_sighand,copy_signal
		 * copy_mm,copy_keys,copy_namespace创建新的数据结构,并把父进程相应数据结构的值复制到新数据结构中。
		 * 除非clone_flags参数指出它们有不同的值。
		 */
		if ((retval = copy_semundo(clone_flags, p)))
			goto bad_fork_cleanup_audit;
		//文件描述符
		if ((retval = copy_files(clone_flags, p)))
			goto bad_fork_cleanup_semundo;
		//文件系统
		if ((retval = copy_fs(clone_flags, p)))
			goto bad_fork_cleanup_files;
		if ((retval = copy_sighand(clone_flags, p)))
			goto bad_fork_cleanup_fs;
		if ((retval = copy_signal(clone_flags, p)))
			goto bad_fork_cleanup_sigh

网站文章

  • 计算机语言bus代表什么,计算机中bus指什么

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。计算机中bus是指总线,总线的作用就是在计算机各部件之间传递信息,由数据总线,地址总线和控制总线组成。总线(Bus)是计算机各种功能...

    2024-02-01 06:40:17
  • 【漏洞复现】JDWP远程命令执行漏洞

    【漏洞复现】JDWP远程命令执行漏洞

    0x01 漏洞描述JPDA(Java Platform Debugger Architecture):即Java平台调试体系架构。Java虚拟机设计的专门的API接口供调试和监控虚拟机使用JPDA按照...

    2024-02-01 06:40:09
  • Node.js模块加载机制

    I. 使用require()加载自定义模块是,必须以./或者…/开头的路径标识符。在加载自定义模块时,如果没有指定./或者…/这样的路径标识符,则node会把它当作内置模块或者第三方模块进行加载。II...

    2024-02-01 06:39:41
  • 从源码分析:Java中的SPI是怎样工作的

    spi介绍提到api,大家或多或少地都接触或者使用过,但是如果说到spi呢,可能了解的人就要少一些。Java SPI的全...

    2024-02-01 06:39:33
  • 家用 文件服务器,家用文件服务器

    家用 文件服务器,家用文件服务器

    家用文件服务器 内容精选换一换远程桌面协议(Remote Desktop Protocol,RDP),是微软提供的多通道的远程登录协议。本节为您介绍如何使用RDP文件远程登录Windows弹性云服务器...

    2024-02-01 06:39:25
  • SpringCloud-向Eureka注册中心注册微服务(微服务的搭建)

    SpringCloud-向Eureka注册中心注册微服务(微服务的搭建)

    Eureka注册中心注册微服务 注明:此项目为本人学习尚硅谷老师的教学视频然后整理核心的配置文件,所有的项目均在以下地址下载。https://github.com/xwbGithub/microservicecloud下载, 本章讲解请参考microservicecloud-provider-dept-8001,首先微服务的服务中心...

    2024-02-01 06:38:54
  • spring实现aop的步骤

    spring实现aop的步骤

    首先注意导入一个jar包! 在applicationContext.xml中配置扫包 :开启aop的自动代理 切面类 @Component//spri

    2024-02-01 06:38:47
  • 爬虫技术原来可以做这么多牛逼哄哄的事情!

    爬虫技术原来可以做这么多牛逼哄哄的事情!

    对于很多对于不懂编程语言的GGMM来说,爬虫技术高深莫测。但是对于IT工程师来说,爬虫技术可以说信手拈来。虽然熟知爬虫技术,你是否知道它竟然可以做这么多这么牛逼哄哄的事情! 1.利用爬虫技术抓取公司用户信息 公司有15k员工,办公系统的hr模块,只要有部门级的管理人员权限就可以看自己部门的几百名员工资料,包括历年历月的工资条和具体个人信息。关键是,网页地址上有员工编号,如果改一下编号...

    2024-02-01 06:38:41
  • 构建工具webpack与babel使用

    构建工具webpack与babel使用

    Babel入门 一、Bable是什么 Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行。 这意味着,你可以现在就用 ES6 编写程序,而不用担心现有环境是否支持。下...

    2024-02-01 06:38:34
  • ASP页面基础知识

    1, 是什么意思呢?是加入样式文件,     href="style.css"   是加入sytle.css样式文件 。rel指定链接link的类型,style指定目标文件href的类型 2,

    2024-02-01 06:37:58