原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

    1. 题目自拟,内容围绕对Linux系统如何创建一个新进程进行;

    2. 可以结合实验截图、绘制堆栈状态执行流程图等;

    3. 博客内容中需要仔细分析新进程的执行起点及对应的堆栈状态等。

    4. 总结部分需要阐明自己对“Linux系统创建一个新进程”的理解

上课提问:

1.进程由哪些部分构成?

pid,state,task_struct,

用户堆栈,内核堆栈,地址空间,代码段,数据段

2.进程是如何被创建?

0号进程手工创建

其他进程调用do_frok

3.新创建的进程从哪里开始执行?

ret_from_fork

实验报告:

  1. 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235

    1. state:运行状态
    2. stack:内核堆栈
    3. tasks:进程链表
    4. mm:内存管理
    5. task_state:任务的状态
    6. pid:进程PID
    7. real_parent children:进程的父子关系
    8. files:文件描述符列表
    9. signal:信号处理相关
    10. splice_pipe:管道相关
  2. 分析fork函数对应的内核处理过程sys_clone,理解创建一个新进程如何创建和修改task_struct数据结构;

    1. fork、vfork和clone三个系统调用都可以创建一个新进程,都是通过调用do_fork来实现进程的创建
    2. 创建新进程需要先复制一个PCB:task_struct
    3. 再给新进程分配一个新的内核堆栈 
      ti = alloc_thread_info_node(tsk, node);
      tsk->stack = ti;
      setup_thread_stack(tsk, orig); //这里只是复制thread_info,而非复制内核堆栈
    4. 再修改复制过来的进程数据,比如pid、进程链表等等,见copy_process内部
    5. 从用户态的代码看fork();函数返回了两次,即在父子进程中各返回一次
      1 *childregs = *current_pt_regs(); //复制内核堆栈
      2 childregs->ax = 0; //为什么子进程的fork返回0,这里就是原因!
      3
      4 p->thread.sp = (unsigned long) childregs; //调度到子进程时的内核栈顶
      5 p->thread.ip = (unsigned long) ret_from_fork; //调度到子进程时的第一条指令地址
    6. do_fork完成了创建中的大部分工作,该函数调用copy_process()函数,然后让进程开始运行。copy_process()函数工作如下:

      • 1、调用dup_task_struct()为新进程创建一个内核栈、thread_info结构和task_struct,这些值与当前进程的值相同
      • 2、检查
      • 3、子进程着手使自己与父进程区别开来。进程描述符内的许多成员被清0或设为初始值。
      • 4、子进程状态被设为TASK_UNINTERRUPTIBLE,以保证它不会投入运行
      • 5、copy_process()调用copy_flags()以更新task_struct的flags成员。表明进程是否拥有超级用户权限的PF_SUPERPRIV标志被清0。表明进程还没有调用exec()函数的PF_FORKNOEXEC标志被设置
      • 6、调用alloc_pid()为新进程分配一个有效的PID
      • 7、根据传递给clone()的参数标志,copy_process()拷贝或共享打开的文件、文件系统信息、信号处理函数、进程地址空间和命名空间等
      • 8、最后,copy_process()做扫尾工作并返回一个指向子进程的指针
  3. 使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone ,验证您对Linux系统创建一个新进程的理解

    1. 下断点的函数:sys_clone do_fork dup_task_struct  copy_process copy_thread ret_from_fork
    2. dup_task_struct()为新进程创建一个内核栈
    3. copy_process()主要完成进程数据结构,各种资源的初始化
  4. 特别关注新进程是从哪里开始执行的?为什么从哪里能顺利执行下去?即执行起点与内核堆栈如何保证一致。

    1. ret_from_fork;决定了新进程的第一条指令地址
    2. copy_thread()函数中的语句p->thread.ip = (unsigned long) ret_from_fork;决定了新进程的第一条指令地址
    3. 在ret_from_fork之前,也就是在copy_thread()函数中*childregs = *current_pt_regs();该句将父进程的regs参数赋值到子进程的内核堆栈
    4. *childregs的类型为pt_regs,里面存放了SAVE ALL中压入栈的参数 故在之后的RESTORE ALL中能顺利执行下去

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

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

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

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

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

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

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

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

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

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

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

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

    分析Linux内核创建一个新进程的过程 进程描述符PCB----task_struct数据结构 操作系统:1.进程管理 2.内存管理 3 文件系统 一.新进程如何创建和修改task_struct数据结 ...

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

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

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

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

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

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

随机推荐

  1. [tools] sublime 使用记录

    1. 目录下的文本搜索功能(自带) 1). 把文件夹拖到 sublime 上 2). 在 sublime 上展开要搜索的目录,右击,选择[find in folder] 2. sublime cons ...

  2. poj4474 Scout YYF I(概率dp+矩阵快速幂)

    Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4100   Accepted: 1051 Descr ...

  3. Spring二 Bean详解

    Bean详解 Spring框架的本质其实是:通过XML配置来驱动Java代码,这样就可以把原本由java代码管理的耦合关系,提取到XML配置文件中管理.这样就实现了系统中各组件的解耦,有利于后期的升级 ...

  4. 如何定制Windows系统右键菜单

    今天心血来潮把几个自己常用的工具定制到了系统的右键菜单.包括notepad++,7zip,还有复制文件全路径和文件夹路径.下面简单介绍一下步骤. 1. Windows系统右键菜单对应的注册表位置 Wi ...

  5. Android Market 分析【安卓市场】

    安卓市场: 通过对表的分析,“下载任务”的数据来源于数据库[app_download],“已安装”的数据来源于数据库[software_installed]. 数据分析:----- bash-3.2# ...

  6. Android_硬编码设置TextView字体大小

    使用如下代码时,发现字号不会变大,反而会变小:size = (int) mText.getTextSize() + 1;mText.setTextSize(size);后来发现getTextSize返 ...

  7. 动态规划晋级——POJ 3254 Corn Fields【状压DP】

    转载请注明出处:http://blog.csdn.net/a1dark 分析:刚开始学状压DP比较困难.多看看就发现其实也没有想象中那么难.这道题由于列数较小.所以将行压缩成二进制来看.首先处理第一行 ...

  8. [Flexbox] Using order to rearrange flexbox children

    Using the order property we alter the order in which flexbox children appear on the page, without ma ...

  9. SVN Checkout 不包括源文件夹根目录(转)

    SVN Checkout 不包括源文件夹根目录,比如我要checkout   trunk/ 下面的所有文件,但是不包括trunk 文件夹 我们可以在svn文件夹后面打个空格,在加个“.”就行了 eg: ...

  10. 工作于内存和文件之间的页缓存, Page Cache, the Affair Between Memory and Files

    原文作者:Gustavo Duarte 原文地址:http://duartes.org/gustavo/blog/post/what-your-computer-does-while-you-wait ...