作业六:分析Linux内核创建一个新进程的过程
分析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内核创建一个新进程的过程的更多相关文章
- 实验 六:分析linux内核创建一个新进程的过程
实验六:分析Linux内核创建一个新进程的过程 作者:王朝宪 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...
- Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程
Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- linux内核分析作业6:分析Linux内核创建一个新进程的过程
task_struct结构: struct task_struct { volatile long state;进程状态 void *stack; 堆栈 pid_t pid; 进程标识符 u ...
- 第六周分析Linux内核创建一个新进程的过程
潘恒 原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 task_struct结构: ...
- 20135202闫佳歆--week6 分析Linux内核创建一个新进程的过程——实验及总结
week 6 实验:分析Linux内核创建一个新进程的过程 1.使用gdb跟踪创建新进程的过程 准备工作: rm menu -rf git clone https://github.com/mengn ...
- 《Linux内核--分析Linux内核创建一个新进程的过程 》 20135311傅冬菁
20135311傅冬菁 分析Linux内核创建一个新进程的过程 一.学习内容 进程控制块——PCB task_struct数据结构 PCB task_struct中包含: 进程状态.进程打开的文件. ...
- Linux内核分析-分析Linux内核创建一个新进程的过程
作者:江军 ID:fuchen1994 实验题目:分析Linux内核创建一个新进程的过程 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/li ...
- 第六周——分析Linux内核创建一个新进程的过程
"万子恵 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 &q ...
- 实验六:分析Linux内核创建一个新进程的过程
原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 题目自拟,内容围绕对Linu ...
随机推荐
- IIS 注册Asp.net 4.0
32位的Windows:---------------------------------------------------------------------------1. 运行->cmd ...
- 【转】开篇python--明白python文件如何组织,理解建立源文件
在Python 中引用是非常简单的事情,这里需要清楚三个概念就可以了包.模块.类.类这个就不用说了. 模块对应的是一个.py 文件,那么module_name 就是这个文件去掉.py 之后的文件名,p ...
- [转载]ArcGIS SERVER 9.3如何清除REST缓存
有时候,发布了一个服务后,但是点击服务后,不能显示出来 http://hostname/ArcGIS/rest/services/服务名称/MapServer 这时候,十有八九是因为REST缓存没有清 ...
- Linux基础第一课——基础知识了解
前言 发展历史 linus 林纳斯 赫尔辛基大学 在自己的笔记本上安上自己写的操作系统 基于Linux内核 Linux内核 也是基于unix内核开发出来 unix 不开源 只能军方和大学使用 Linu ...
- Android开发之jdk安装及环境变量配置
然后开始配置环境变量,JAVA_HOME,Path和classpath三部分: (1)在变量名输入框中写入“JAVA_HOME”,在变量值输入框中写入“C:\Program Files\Java\jd ...
- impala客户端连接
想要使用plsql连接oracle一样,使用类似工具连接impala的方法:ClouderaImpalaODBC32.msi下载地址:http://www.cloudera.com/downloads ...
- std::max、std::min error C2589: “(”:“::”右边的非法标记,error C2059: 语法错误:“::”
在VC++种同时包含头文件#include <windows.h>和#include <algorithm>后就会出现无法正常使用std标准库中的min和max模板函数,经过查 ...
- JS仿QQ空间鼠标停在长图片时候图片自动上下滚动效果
JS仿QQ空间鼠标停在长图片时候图片自动上下滚动效果 今天是2014年第一篇博客是关于类似于我们的qq空间长图片展示效果,因为一张很长的图片不可能全部把他展示出来,所以外层用了一个容器给他一个高度,超 ...
- Scala_方法和函数
方法的定义 def functionName([参数列表]) : [return type] = { function body return [] } 如果没有=和{}包裹的方法体,那么该方法被隐式 ...
- 大数据入门第二十四天——SparkStreaming(一)入门与示例
一.概述 1.什么是spark streaming Spark Streaming is an extension of the core Spark API that enables scalabl ...