作者:严哲璟

原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

fork属于系统调用,而此系统调用创建一个子进程,由于其为系统调用,所以基本的用户态到内核态的切换,以及中断的处理,都与普通的系统调用一样,分为3个主要过程

1.调用fork这个API,然后软中断,进入内核态,堆栈切换到内核堆栈,保存用户态sp,cs:eip;

2.执行system_call,然后SAVE_ALL,根据eax寻找系统调用表中对应的中断服务程序,这里是sys_clone

3.执行sys_clone

与普通的系统调用不一样的是,sys_clone需要执行do_fork,产生一个新的进程

下面是相关的流程图:

do_fork()

{

copy_process(....){                        //复制进程相关信息

dup_tusk_struct(current){                      //复制PCB

alloc_task_struct_node()           //相关PCB指针赋值

arch_dup_task_struct()

alloc_thread_info_node()            //创建8KB大小的内存空间放置stack以及thread_info,返回stack起始地址ti

setup_thread_info()                   //初始化thread_info

}

对新进程P的其他信息修改,因为所有信息都是复制的所以必须修改

retval=copy_thread(P)                                   //设置新进程的起始地址,新进程的内核堆栈

}

}

下面详细说进程创建以及堆栈的切换(此时在执行fork的父进程中)

copy_thread()

p->thread.ip=ret_from_fork          //新进程的入口地址

p->thread.sp=childregs                  //将新进程的内核堆栈指向

childregs=current_pt_regs           //父进程内核堆栈数据被拷贝

childregs->sp=sp;                            //将拷贝的sp设置为传入的sp,即子进程的sp.

此时子进程的内核堆栈如下:

stack(ti),childregs            :  current_pt_regs   (简单复制)

ax=0;                   修改 ax

sp=sp;                  修改sp

执行jmp_syscall_exit跳转至syscall_exit,然后restore_all将子进程的内核堆栈所有信息弹出,由于压栈的sp被修改成do_fork传入参数的sp,因此返回到子进程的用户堆栈,返回时同样需要检测调度信号

Linux系统基于fork()新进程的创建的更多相关文章

  1. Linux系统编程之--守护进程的创建和详解【转】

    本文转载自:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终 ...

  2. 脚本_查找 Linux 系统中的僵尸进程

    #!bin/bash#功能:查找Linux系统中的僵尸进程#作者:liusingbon#使用awk判断ps命令输出的第8列为Z时,显示该进程的 PID 和进程命令ps aux |awk '{if($8 ...

  3. linux系统编程:守护进程详解及创建,daemon()使用

    一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...

  4. linux 新进程的创建

    慕课18原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.背景知识: 1. ...

  5. linux用户栈内核栈的设置---进程的创建: fork/execve【转】

    转自:http://blog.csdn.net/u011279649/article/details/18795547 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 应用层怎 ...

  6. [linux] C语言Linux系统编程-做成守护进程

    守护进程: 必须是init进程的子进程,运行在后台,不与任何控制终端相关联. 通过以下步骤成为守护进程 1.调用fork()创建出来一个新的进程,这个新进程会是将来的守护进程 2.在新守护进程的父进程 ...

  7. Linux系统下输出某进程内存占用信息的c程序实现

    在实际工作中有时需要程序打印出某个进程的内存占用情况以作参考, 下面介绍一种通过Linux下的伪文件系统/proc 计算某进程内存占用的程序实现方法. 首先, 为什么会有所谓的 伪文件 呢. Linu ...

  8. Linux系统监视资源与进程管理

    Linux 系统中时刻运行着许多的进程,如果能够合理的管理它们,有益于系统性能的优化, 系统进程总共有五种不同的状态: 命令一:ps命令,用于查看系统中进程状态 格式:ps [参数] 查看进程与状态: ...

  9. 浅谈Linux系统中如何查看进程

    进程是一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源.一般来说,Linux系统会在进程之间共享程序代码和系统函数库,所以在任何时刻内存中都只有代码的一份拷贝. 1,ps命令 作用:p ...

随机推荐

  1. 在Mac电脑上使用NTFS移动硬盘遇到问题

    1.sudo nano/etc/fstab 回车 输电脑密码 2.进入文本插入页面  编入: LABEL=硬盘名字 NONE ntfs rw,auto,nobrowse 3.ctrl + X 退出 选 ...

  2. IT 技术人需要思考的 15 个问题

    行内的人自嘲是程序猿.屌丝和码农,行外的人也经常拿IT人调侃,那么究竟是IT人没有价值,还是没有仔细思考过自身的价值? 1.搞 IT 的是屌丝.码农.程序猿? 人们提到IT人的时候,总会想到他们呆板. ...

  3. 第四章 QML语法

    4.1 语法基础 import QtQuick 2.6 import QtQuick.Window 2.2 Rectangle { width: 400 height: 400 color: &quo ...

  4. 如何安全修改cocoapods上的第三方代码

    其实搞java的都知道maven管理,解决第三方代码修改的办法就是架一个服务器,把这些修改的库放在这里,然后再maven里配置哪些需要用本地仓库的.其实cocoapods也可以做本地包管理: 大致方法 ...

  5. HDU 5179 beautiful number (数位dp / 暴力打表 / dfs)

    beautiful number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. face_recognition开源人脸识别库:离线识别率高达99.38%

    基于Python的开源人脸识别库:离线识别率高达99.38%——新开源的用了一下感受一下 原创 2017年07月28日 21:25:28 标签: 人脸识别 / 人脸自动定位 / 人脸识别开源库 / f ...

  7. 137、TensorFlow使用TextCNN进行文本分类

    下面是分类的主函数入口 #! /usr/bin/env python import tensorflow as tf import numpy as np import os import time ...

  8. 获取小程序accessToken

    private static String getAccessToken(){ String url = "https://api.weixin.qq.com/cgi-bin/token? ...

  9. 第 11 章 python线程与多线程

    一.什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程. 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位. 多线程(即多 ...

  10. Selenium+Java环境搭建

    1. 安装JDK URL:http://www.oracle.com/technetwork/java/javase/downloads/ 2. 配置环境变量 JAVA_HOME = E:\Java\ ...