码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2016-03-31 14:29:58      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

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

攥写人:杨光  学号:20135233

( *原创作品转载请注明出处*)

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

知识点及分析:

***Linux通过复制父进程来创建一个新进程

      fork函数,具体的过程:

  1. 复制一个PCB——task_struct
  2. 要给新进程分配一个新的内核堆栈

        ti = alloc_thread_info_node(tsk, node);
        tsk->stack = ti;
        setup_thread_stack(tsk, orig);       //这里只是复制thread_info,而非复制内核堆栈
  3. 要修改复制过来的进程数据,比如pid、进程链表等,见copy_process内部。

    *childregs = *current_pt_regs(); //复制内核堆栈
    childregs->ax = 0; // 子进程的fork返回0
    
    p->thread.sp = (unsigned long) childregs; //调度到子进程时的内核栈顶
    p->thread.ip = (unsigned long) ret_from_fork; //调度到子进程时的第一条指令地址    

系统调用内核处理函数sys_fork,sys_vfrok,sys_clone,其实最终执行的都是do_fork

do_fork里有:

  copy_process

      dup_task_struct // 复制pcb
      alloc_thread_info_node  // 创建了一个页面,其实就是实际分配内核堆栈空间的效果。
      setup_thread_stack  // 把thread_info的东西复制过来
之后初始化子进程

***创建的新进程是从哪里开始执行的--》ret_from_fork

 

*childregs = *current_pt_regs();  复制内核堆栈(复制的pt_regs,是SAVE_ALL中系统调用压栈的那一部分。)
childregs->ax = 0;                               子进程的fork返回0
     
p->thread.sp = (unsigned long) childregs;        调度到子进程时的内核栈顶
p->thread.ip = (unsigned long) ret_from_fork;    调度到子进程时的第一条指令地址

ip指向的是ret_from_fork,所以是从这里开始执行的。

实验要求:

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

  2. 分析fork函数对应的内核处理过程sys_clone,理解创建一个新进程如何创建和修改task_struct数据结构;

  3. 使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone ,验证您对Linux系统创建一个新进程的理解,推荐在实验楼Linux虚拟机环境下完成实验。

  4. 特别关注新进程是从哪里开始执行的?为什么从哪里能顺利执行下去?即执行起点与内核堆栈如何保证一致。

实验过程:

删除原来的menu,并clone新的menu,用test_fork.c覆盖test.c

技术分享

 make rootfs之后新的内核启动,测试fork功能

技术分享

 使用-s -S冷冻内核,准备调试

技术分享

技术分享

 gdb

技术分享

 加载符号表,配置端口

技术分享

 设置断点

技术分享

技术分享

根据断点,进行跟踪,得到结果

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

 

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

标签:

原文地址:http://www.cnblogs.com/yg137565645/p/5340874.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!