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

1、操作系统内核三大功能是进程管理,内存管理,文件系统,最核心的是进程管理。

2、对应的三个抽象的概念是进程,虚拟内存和文件。其中,操作系统最核心的功能是进程管理。

3、fork 被调用一次,能够返回两次。在父进程中返回新创建子进程的 pid;在子进程中返回 0

4、TASK_RUNNING有两个状态,一个是就绪态但是没有运行,另一个是运行态,这两个状态的转换依赖于内核中的调度器。

TASK_RUNNING处运行态取决于它是否获得了CPU的控制权;如果被内核调度出去,就在等待队列中。

对于正在运行的进程,调用用户态库函数exit()会陷入内核执行do_exit()进入TASK_ZOMBIE状态。

5、进程控制块PCB:task_struct

struct task_struct {

volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped 进程状态,-1表示不可执行,0表示可执行,大于1表示停止*/

void stack; //内核堆栈

atomic_t usage;

unsigned int flags; /
per process flags, defined below 进程标识符 * /

unsigned int ptrace;

6、Linux中创建进程一共有三个函数:fork,创建子进程 vfork,与fork类似,但是父子进程共享地址空间,而且子进程先于父进程运行。Linux中所有的进程创建都是基于复制式,Linux通过复制父进程来创建一个新进程,通过调用do_ fork来实现。然后对子进程做一些特殊的处理。

do_fork

       long do_fork(unsigned long clone_flags, unsigned long stack_start,
unsigned long stack_size, int __user *parent_tidptr,
int __user *child_tidptr)
clone_flags:子进程创建相关标志,通过此标志可以对父进程的资源进行有选择的复制。
stack_start:子进程用户态堆栈的地址。
regs:指向 pt_regs 结构体(当系统发生系统调用时,pt_regs 结构体保存寄存器中的值并按顺序压入内核栈)的指针。
stack_size:用户态栈的大小,通常是不必要的,总被设置为0。
parent_tidptr 和 child_tidptr:父进程、子进程用户态下 pid 地址。

其主要作用为:调用copy_process,将当期进程复制一份出来为子进程,并且为子进程设置相应地上下文信息。初始化vfork的完成处理信息(如果是vfork调用)调用wake_up_new_task,将子进程放入调度器的队列中,此时的子进程就可以被调度进程选中,得以运行。如果是vfork调用,需要阻塞父进程,知道子进程执行exec。

copy_process 复制父进程的所有信息给子进程,调用 dup_task_struct 复制当前的 task_struct,进行信息检查、初始化、把进程状态设置为 TASK_RUNNING,调用 copy_thread 初始化子进程内核栈,设置子进程pid。

dup_task_struct中为子进程分配了新的堆栈。

copy_thread系统调用函数完成赋值功能。

二、实验

1.添加命令



2、打开gdb调试



3、设置断点



4、do_fork系统内核调用



5、copy_process复制信息



6、copy_thread系统调用赋值



总结:

本章深入了解了系统创建进程的过程,使用fork,vfork,clone等调用创建进程,都是通过调用do_fork来实现的。

整体系统调用嵌套顺序:Sys_clone , Do_fork, Copy_process, Dup_talk_struct, Copy_thread, Ret_from_fork.

copy_thread中将子进程的ip设置为ret_form_fork的首地址,所以子进程是从ret_form_fork开始执行的。

2018-2019-1 20189210 《LInux内核原理与分析》第七周作业的更多相关文章

  1. 2019-2020-1 20199329《Linux内核原理与分析》第九周作业

    <Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...

  2. 2019-2020-1 20199329《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...

  3. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

  4. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

  5. 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...

  6. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

  7. 2019-2020-1 20209313《Linux内核原理与分析》第二周作业

    2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...

  8. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  9. 《Linux内核原理与分析》第一周作业 20189210

    实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...

  10. 2018-2019-1 20189221《Linux内核原理与分析》第二周作业

    读书报告 <庖丁解牛Linux内核分析> 第 1 章 计算工作原理 1.1 存储程序计算机工作模型 1.2 x86-32汇编基础 1.3汇编一个简单的C语言程序并分析其汇编指令执行过程 因 ...

随机推荐

  1. react实战项目开发(2) react几个重要概念以及JSX语法

    前言 前面我们已经学习了利用官方脚手架搭建一套可以应用在生产环境下的React开发环境.那么今天这篇文章主要先了解几个react重要的概念,以及讲解本文的重要知识JSX语法 React重要概念 [思想 ...

  2. A Basic Course in Partial Differential Equations

    A Basic Course in Partial Differential Equations, Qing Han, 2011 [下载说明:点击链接,等待5秒, 点击右上角的跳过广告后调至下载页面, ...

  3. Centos 7 图形安装笔记(超详细)

    1. 下载虚拟机(VMware Workstation Pro) 2. 安装虚拟机(Windows下安装虚拟机,自行网上搜索) 3. 下载Centos 7.4系统(国内建议使用阿里云: http:// ...

  4. [译]Ocelot - Configuration

    原文 这里有一个配置的样例.配置主要有两个部分.一个是ReRoutes数组,另一个是GlobalConfiguration.ReRoute告诉Ocelot怎么处理上游的请求.Global config ...

  5. java8 list转map

    //按id属性为map的key值 Map<Integer, User> userMap = list.stream().collect(Collectors.toMap(User::get ...

  6. 删除对象的某个属性 delete

    有时候我们可能会遇到需要删除一个对象的某个属性的这种情况,保留剩下的,不想遍历,那我们就可以使用delete操作符, let obj = { a: 1, b: 2, c: 3 } delete obj ...

  7. 【原创】大叔问题定位分享(3)Kafka集群broker进程逐个报错退出

    kafka0.8.1 一 问题现象 生产环境kafka服务器134.135.136分别在10月11号.10月13号挂掉: 134日志 [2014-10-13 16:45:41,902] FATAL [ ...

  8. [正则表达式]PCRE反向分组引用(语法)

    正则表达式中,凡出现圆括号(),括号中的匹配内容就会被认为是一个分组: 根据括号从左边出现的顺序命名分组代号,分组代号由1到n(代号0通常被一些语言用来引用整个表达式匹配的结果,即使这个表达式没有分组 ...

  9. 在vue-cli3 中import引入一个没有export default{}的js文件

    如果这个js文夹,放在vue-cli3中搭建的项目中的,public文件夹下,通过 //.js可以省略不行 import '/public/xxx.js' 其实你在浏览器中看的时候,发现会报错误 :  ...

  10. Three teachers who make differences in my life

    人生路漫漫,从小到大,经历过九年义务教育的我们也受到过很多老师的熏陶,而已经进入大学的我也会回想起那些给我带来别样意义的老师们. 亲爱的老李-老李是我初中的班主任,也是我的历史老师.依稀记得上他的课会 ...