分析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. yaml格式

    yaml中允许表示三种格式,分别为常量值.对象和数组 例如: 其中#作为注释,yaml中只有行注释 基本格式要求: 1.大小写敏感:2.使用缩进代表层级关系: 3.缩进只能使用空格,不能使用tab键, ...

  2. cpu的核心数及线程关系

    CPU个数.核心数.逻辑CPU个数:一个物理CPU可以有多个核心,一个CPU核就是一个物理线程,由英特尔开发超线程技术可以把一个物理线程模拟出两个线程来使用,使得单个核心用起来像两个核一样,以充分发挥 ...

  3. hadoop备战:yarn框架的搭建(mapreduce2)

    昨天没有写好了没有更新,今天一起更新,yarn框架也是刚搭建好的. 我这里把hadoop放在了我的个人用户hadoop下了,你也能够尝试把它放在/usr/local,考虑的问题就相对多点. 主要的软硬 ...

  4. Netty入门(十)解码分隔符和基于长度的协议

    我们需要区分不同帧的首尾,通常需要在结尾设定特定分隔符或者在首部添加长度字段,分别称为分隔符协议和基于长度的协议,本节讲解 Netty 如何解码这些协议. 一.分隔符协议 Netty 附带的解码器可以 ...

  5. 页面中php传值后循环列表js获取点击的id

    页面中php传值后循环列表js获取点击的id值进行js操作 <script type="text/javascript" src="__PUBLIC__/js/jq ...

  6. SpringMVC之ajax+select下拉框交互常用方式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. lnmp服务器配置HTTPS

    server { server_name ktsf.weiyou18.com; #listen 80; listen 443; ssl on; ssl_certificate /usr/local/n ...

  8. PAT B1035 插入与归并 (25 分)

    根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭 ...

  9. day05-列表类型

    列表类型: 用途:存放多个值,根据索引. 定义方式:在[]内用逗号分隔开多个任意类型的值 L1 = list[{a:1,b:2,c:3}] 输出的为字典的key值 常用操作+内置方法 1.按索引取值: ...

  10. C#/JS AES字符串加密和解密

    往往我们有一种需求:在页面端实现对即将传入到后台端的某些字符串进行加密,然后在后台端对传入进来的字符串做解密.在一些有安全要求的数据传输上会用到此种方式 下面分别列出js端和后台端的加密或解密代码. ...