原创作品转载请注明出处 + 《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. HTML参考手册

    New : HTML5 中的新标签. 标签 描述 <!--...--> 定义注释. <!DOCTYPE>  定义文档类型. <a> 定义锚. <abbr> ...

  2. python BDD&TDD

    教程一:行为驱动开发(BDD) 基于Python的行为驱动开发实战: http://python.jobbole.com/81303/ 基于Python的行为驱动开发实战 英语原文地址: http:/ ...

  3. redis合库

    玩家数据全部保存在redis,对合服来绝对是个坑.因为一直都是做开发,合库这事还是第一次操作. 首先,合服要做哪些事情,当然不同的游戏肯定不一样.合服的目的是为了增加同个服务器上活跃玩家的数量.合服有 ...

  4. Java中基本数据类型和包装器类型的关系

    在程序设计中经常用到一系列的数据类型,在Java中也一样包含八中数据类型,这八种数据类型又各自对应一种包装器类型.如下表: 基本类型 包装器类型 boolean Boolean char Charac ...

  5. Linux 和 Windows 下对long long的输出

    以前一直用__int64来识别windows还是Linux,可是发现HDU好像不认 看到wzy用的UNIX可以. UNIX是Linux下定义的,具体是什么可以去百度. 那么就可以 #ifdef UNI ...

  6. python 学习笔记 copy

    浅copy >>> a=[1,2,3,[4,5,6]]>>> a[1, 2, 3, [4, 5, 6]]>>> a[3].append(7)> ...

  7. [转] tomcat结合nginx使用小结

    相信很多人都听过nginx,这个小巧的东西慢慢地在吞食apache和IIS的份额.那究竟它有什么作用呢?可能很多人未必了解. 说到反向代理,可能很多人都听说,但具体什么是反向代理,很多人估计就不清楚了 ...

  8. [转] Nginx + CGI/FastCGI + C/Cpp

    接着上篇<Nginx安装与使用>,本篇介绍CGI/FASTCGI的原理.及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx.内容大纲如下: ...

  9. 为什么app都是异步编程

    对本文题目首先需要了解一下什么是异步编程,异步编程即多线程编程. 多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径. 在具体理解多线程之前先看一个都理解的例子: 在系统级别内,程序并排 ...

  10. 《Android开发艺术探索》读书笔记 (10) 第10章 Android的消息机制

    第10章 Android的消息机制 10.1 Android消息机制概述 (1)Android的消息机制主要是指Handler的运行机制,其底层需要MessageQueue和Looper的支撑.Mes ...