分析Linux内核创建一个新进程的过程

进程描述符PCB----task_struct数据结构

	操作系统:1.进程管理 2.内存管理 3 文件系统

一、新进程如何创建和修改task_struct数据结构

1.复制当前进程(创建新进程通过复制当前进程来实现)
2.给新进程分配新的内核堆栈
3.修改复制过来的进程数据(如pid,状态链表,内核堆栈,ip,sp)

1.进程创建

1.fork系统调用在父子进程各返回一次,子进程的返回值=0,父进程的返回值=子进程的PID
2.fork、vfork、clone三个系统调用可创建一个新进程,最后通过do_fork实现进程创建。

2.新进程的开始执行地点

1.ret_from_fork开始执行。
2.int指令和SAVE_ALL压倒内核栈的内容
3.ENTRY(ret_from_fork){
...jmp syscall_exit...} //跳转到system_call中的syscall_exit
4.由system_call中前面save_all判断,实际syacall_call之前的堆栈状态是一样,继续往下执行,返回用户态。不是父进程,而是子进程。

3.进程:处于执行期的程序以及相关的资源的总称。

1.fork()创建新进程,父进程用fork创建子进程。fork系统调用从内核返回两次:一次回到父进程,一次回到子进程。
2.在Linux内核中,fork()实际有clone()系统调用实现的。
3.程序通过exit()系统调用退出执行。最终中介进程并将其占用的资源释放掉。

4.进程描述符及任务结构

内核把进程的列表存放在任务队列的双向循环列表中
链表中每一项都是类型为task_struck,称为进程描述符的结构,该结构定义在<linux/sched.h>文件中

5.进程状态

	(1)TASK_RUNNING(运行)——进程是可执行。进程在用户空间中执行的唯一可能的状态,也可以应用到内核空间中正在执行的
(2)TSK_INTERRUPTIBLE
(3) TASK_UNINTERRUPTIBLE
(4)_TASK_TRACED
(5)_TASK_STOOPED

6.进程上下文

一般程序在用户空间执行。当一个程序调执行了系统调用或者触发了某个异常,它就陷入了内核空间。成内核“代表进程执行”,并处于进程上下文中。

7.进程家族数

所有的进程都是PID为1的init进程的后代,内核在系统启动的最后阶段启动init进程。

二、使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone和分析fork函数对应的系统调用处理过程









三、总结部分

Linux系统创建一个新进程的理解

1.fork实际开销是复制父进程的页表以及给子进程创建唯一的进程描述符**

2.Linux通过clone()系统调用实现fork()**

3.fork(),vfork(),和clone()库函数都是根据各自需要的参数标志去调用clone(),然后由clone()调用do_fork**

do_fork函数调用了copy_process()函数,然后让进程执行

  Linux通过复制父进程创建新进程,fork、vfork、clone都是通过do_exit实现进程的创建。
-A.复制一个PCB
-B.给新进程分配一个新的内核堆栈(复制了thread_info,不是复制了内核堆栈)
-C.修改复制的数据,即子进程初始化。 从用户态代码看父进程和子进程各返回一次,而子进程从ret_from_fork函数开始执行,从函数中跳转到syscall_exit,即system_call中的语句。

注明:郑伟 + 参考资料:《Linux内核设计与实现》 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

作业六:分析Linux内核创建一个新进程的过程的更多相关文章

  1. 实验 六:分析linux内核创建一个新进程的过程

    实验六:分析Linux内核创建一个新进程的过程 作者:王朝宪  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...

  2. Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程

    Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  3. linux内核分析作业6:分析Linux内核创建一个新进程的过程

    task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  u ...

  4. 第六周分析Linux内核创建一个新进程的过程

    潘恒 原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 task_struct结构: ...

  5. 20135202闫佳歆--week6 分析Linux内核创建一个新进程的过程——实验及总结

    week 6 实验:分析Linux内核创建一个新进程的过程 1.使用gdb跟踪创建新进程的过程 准备工作: rm menu -rf git clone https://github.com/mengn ...

  6. 《Linux内核--分析Linux内核创建一个新进程的过程 》 20135311傅冬菁

    20135311傅冬菁 分析Linux内核创建一个新进程的过程 一.学习内容 进程控制块——PCB  task_struct数据结构 PCB task_struct中包含: 进程状态.进程打开的文件. ...

  7. Linux内核分析-分析Linux内核创建一个新进程的过程

    作者:江军 ID:fuchen1994 实验题目:分析Linux内核创建一个新进程的过程 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/li ...

  8. 第六周——分析Linux内核创建一个新进程的过程

    "万子恵 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 &q ...

  9. 实验六:分析Linux内核创建一个新进程的过程

    原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 题目自拟,内容围绕对Linu ...

随机推荐

  1. IIS 注册Asp.net 4.0

    32位的Windows:---------------------------------------------------------------------------1. 运行->cmd ...

  2. 【转】开篇python--明白python文件如何组织,理解建立源文件

    在Python 中引用是非常简单的事情,这里需要清楚三个概念就可以了包.模块.类.类这个就不用说了. 模块对应的是一个.py 文件,那么module_name 就是这个文件去掉.py 之后的文件名,p ...

  3. [转载]ArcGIS SERVER 9.3如何清除REST缓存

    有时候,发布了一个服务后,但是点击服务后,不能显示出来 http://hostname/ArcGIS/rest/services/服务名称/MapServer 这时候,十有八九是因为REST缓存没有清 ...

  4. Linux基础第一课——基础知识了解

    前言 发展历史 linus 林纳斯 赫尔辛基大学 在自己的笔记本上安上自己写的操作系统 基于Linux内核 Linux内核 也是基于unix内核开发出来 unix 不开源 只能军方和大学使用 Linu ...

  5. Android开发之jdk安装及环境变量配置

    然后开始配置环境变量,JAVA_HOME,Path和classpath三部分: (1)在变量名输入框中写入“JAVA_HOME”,在变量值输入框中写入“C:\Program Files\Java\jd ...

  6. impala客户端连接

    想要使用plsql连接oracle一样,使用类似工具连接impala的方法:ClouderaImpalaODBC32.msi下载地址:http://www.cloudera.com/downloads ...

  7. std::max、std::min error C2589: “(”:“::”右边的非法标记,error C2059: 语法错误:“::”

    在VC++种同时包含头文件#include <windows.h>和#include <algorithm>后就会出现无法正常使用std标准库中的min和max模板函数,经过查 ...

  8. JS仿QQ空间鼠标停在长图片时候图片自动上下滚动效果

    JS仿QQ空间鼠标停在长图片时候图片自动上下滚动效果 今天是2014年第一篇博客是关于类似于我们的qq空间长图片展示效果,因为一张很长的图片不可能全部把他展示出来,所以外层用了一个容器给他一个高度,超 ...

  9. Scala_方法和函数

    方法的定义 def functionName([参数列表]) : [return type] = { function body return [] } 如果没有=和{}包裹的方法体,那么该方法被隐式 ...

  10. 大数据入门第二十四天——SparkStreaming(一)入门与示例

    一.概述 1.什么是spark streaming Spark Streaming is an extension of the core Spark API that enables scalabl ...