程涵 

原创博客

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000


进程的描述和进程的创建

知识点梳理:

一、 进程的描述

(1)操作系统的三大管理功能包括

  • 进程管理

  • 内存管理

  • 文件系统

(2)PCB task_struct中包含

  • 进程状态

  • 进程打开的文件

  • 进程优先级信息

(3)通过唯一的进程标识PID来区别每个进程。

(4)进程状态(代码分析)

http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235

由以上代码可以看到task_struct的运行状态,进程标识符flags。

由以上代码可以看到地址空间。

可以看到进程父子关系。

(5)分析fork函数对应的内核处理过程sys_clone

dup_thread复制父进程的PCB

copy_process修改复制的PCB以适应子进程的特点

二、 进程的创建

1.进程的创建概览及fork一个进程的用户态代码

(1)进程的起源

  • 道生一(start_kernel...cpu_idle)
  • 一生二(kernel_init和kthreadd)
  • 二生三(即前面的0、1、2三个进程)
  • 三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先)

(2)0号进程手工写,1号进程复制、加载init程序

(3)shell命令行是如何启动进程的

2.Linux中创建进程一共有三个函数:

  • fork,创建子进程
  • vfork,与fork类似,但是父子进程共享地址空间,而且子进程先于父进程运行。
  • clone,主要用于创建线程

  Linux中得线程是通过模拟进程实现的,较新的内核使用的线程库一般都是NPTL。

  • 复制一个PCB——task_struct

err = arch_dup_task_struct(tsk, orig);
  • 给新进程分配一个新的内核堆栈

ti = alloc_ thread_ info_ node(tsk, node);
tsk->stack = ti;
setup_ thread_ stack(tsk, orig); //这里只是复制thread_ info,而非复制内核堆栈
  • 要修改复制过来的进程数据,比如pid、进程链表等。具体见copy _process内部
  • 从用户态的代码看fork(),函数返回了两次,即在父子进程中各返回一次。

实验内容及截图

编译内核,可以看到fork命令

启动gdb调试,并对主要的函数设置断点

执行一个fork,会发现只输出一个fork的命令描述,后面并没有执行,因为它停在了sys_ clone这个位置。

新进程是从ret_from_fork开始执行的,决定了新进程的第一条指令地址。

因为在ret_ from_ fork之前,也就是在copy_ thread()函数中* childregs = * current_ pt_ regs();该句将父进程的regs参数赋值到子进程的内核堆栈。

* childregs的类型为pt_ regs,里面存放了SAVE_ ALL中压入栈的参数,因此在之后的RESTORE ALL中能顺利执行下去。

【MOOC EXP】Linux内核分析实验六报告的更多相关文章

  1. Linux内核分析实验六

    Linux内核分析实验六 进程控制块PCB——task_struct(进程描述符) 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_s ...

  2. 【MOOC EXP】Linux内核分析实验八报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程的切换和系统的一般执行过程 知识点 ...

  3. 【MOOC EXP】Linux内核分析实验七报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 可执行程序的装载 知识点梳理 一.预处 ...

  4. 【MOOC EXP】Linux内核分析实验一报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  [反汇编一个简单的C程序]   实验 ...

  5. 【MOOC EXP】Linux内核分析实验二报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  [操作系统是如何工作的]   教学内 ...

  6. 【MOOC EXP】Linux内核分析实验三报告

     程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [跟踪分析Linux内核的启动过程] ...

  7. 【MOOC EXP】Linux内核分析实验四报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [使用库函数API和C代码中嵌入汇编代 ...

  8. 【MOOC EXP】Linux内核分析实验五报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 分析system_call中断处理过程 ...

  9. “Linux内核分析”实验一报告

    张文俊 + 原创作品转载请注明出处 + <Linux 内核分析> MOOC 课程 实验要求: 1.总结部分要求阐明自己对“计算机是如何工作的”理解: 2.博客中需要使用实验截图: 实验内容 ...

随机推荐

  1. 05LaTeX学习系列之---TeX的命令行操作

    目录 目录 前言 (一)查看版本号 1.查看TeX的版本号 2.查看LaTeX的版本号 3.查看XeLeTeX的版本号 (二)更行版本 (三)用命令行来编译.tex文件 1.用LaTeX编译 2.用X ...

  2. February 9th, 2018 Week 6th Friday

    Every one of us want to ameliorate our own condition. You can only cure retail but you can prevent w ...

  3. MATLAB三维作图——隐函数

    MATLAB三维作图——隐函数 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 对于三维隐函数,没有显式表达式,无法通过Matlab现成的3-D画图函数 ...

  4. JDBC学习笔记之建立连接

    1. 引言 在一个JDBC应用程序中,如果想建立和数据源的连接,那么可以使用以下两个类: DriverManager:通过数据源的URL,我们可以建立与指定的数据源的连接.如果使用 JDBC 4.0 ...

  5. Handler实现线程间的通信2

    与Handler实现线程间的通信1反过来MainThread中向WorkerThread中发送消息

  6. C++面试基础知识

    C++经典面试题(最全,面中率最高 1.new.delete.malloc.free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数.malloc与free ...

  7. Linux 读取 (*.xls)文件读取,使用libxls库

    首先下载libxls,项目地址:http://sourceforge.net/projects/libxls/,备用下载:libxls-1.4.0.zip 解压后使用: ./configure --p ...

  8. C语言程序设计II—第四周教学

    第四周教学总结(18/3-24/3) 教学内容 本周的教学内容为:第七章 数组 7.2 二维数组 课前准备 在博客园发布作业:2019春第四周作业 第三周作业讲解视频:A Programing Vid ...

  9. Android 去掉ScrollView、GridView、ListView向上 滑动时顶部的投影/阴影

    在ScrollView.GridView.ListView向上滑动的过程中,这些控件的顶部会出现一个系统默认的白色阴影,有些时候这个白色的阴影看上去好看,那么就需要除去. 去掉方法:在ScrollVi ...

  10. lesson 4:凯撒密码问题

    一·问题描述 二·解决过程 1.设计思路 ①人机交互界面 ②加密函数(将字符串的每一个字符提取出来,通过对字符的阿斯克码值进行运算操作实现加密过程,特殊的特殊对待) ③解密函数(与加密函数算法类似) ...