• 《Linux内核分析》第六周学习总结


    《Linux内核分析》第六周学习总结

                            ——进程的描述和进程的创建

    姓名:王玮怡  学号:20135116

    一、理论部分

    (一)进程的描述

    1、进程描述符task_stuck数据结构(一)

    操作系统三大功能:进程管理(核心)、内存管理、文件系统

    PCB task_struct中包含:进程状态、进程打开的文件、进程优先级信息

    进程控制块PCB——进程描述符task_stuck提供了内核所需了解的进程信息

    Linux进程状态转换图:

    2、进程描述符task_stuck数据结构(二)

      内核把进程的列表存放在任务队列的双向循环链表中

    (1)非空双向链表结构

    (2)空双向链表结构

    (3)进程父子关系

    (二)进程创建

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

    (1)进程的创建:start_kernel ...cpu_idle -->kernel_init和kthreadd -->0、1、2号进程(其中1号进程是所有用户线程的祖先,2号进程是所有内核线程的祖先)

    (2)fork()系统调用:在用户态创建一个子进程

      else if和else都会被执行:fork系统调用在父进程和子进程中各会返回一次,在子进程中pid的返回值为0,在父进程中的返回值为子进程的pid。

    2、理解进程创建过程发杂代码的方法

    创建新进程是通过复制当前进程来实现的,父、子进程大多数信息相同,但有些不同,如pid、内核堆栈等,并且只复制了一部分(内核堆栈栈底内容,SAVE_ALL部分)。

    3、浏览创建进程的相关关键代码

    (1)系统调用内核处理函数sys_fork、sys_clone、sysvfork:

    fork、vfork和clone三个系统调用都可以创建一个新进程,而且都是通过调用do_fork来实现进程的创建。

    (2)do_fork()

    (3)copy_procrss()中dup_task_stuck()复制PCB

    (4)alloc_thread_info_node()分配内核堆栈空间

    (5)copy_thread()中

    • struct pt_regs *childregs = task_pt_regs(p);  //从子进程的pid(stack内核堆栈)找到其栈空间,SAVE_ALL地址
    • *childregs = *current_pt_regs();  //拷贝当前进程(父进程)的内核堆栈的栈底(SAVE_ALL)的内容,内核堆栈已有数据的拷贝

    4、创建的新进程是从哪里开始执行的

      p->thread.ip = (unsigned long) ret_from_fork;  //调度到子进程时的第一条指令

    当子进程获得CPU的控制权开始运行, ret_from_fork可以使其出栈从iret返回到子进程用户态。

    二、实验部分:使用gdb跟踪创建新进程的过程

    1、启动MenuOS,并查看fork功能:

    2、gdb调试fork指令

    (1)qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

    (2)在新打开的shell窗口中进程调试:

     (3)设置断点

    (4)在MenuOS中执行fork,就会发现fork函数停在了父进程中 

    (5)继续执行之后,停在了do_fork的位置

    然后n单步执行,依次进入copy_process、dup_task_struct

    按s进入该函数,可以看到dst = src(也就是复制父进程的struct)

    (6)在copy_thread中,可以看到把task_pg_regs(p)也就是内核堆栈特定的地址找到并初始化

    三、总结

      Linux通过复制父进程来创建一个新进程,通过调用do_ fork来实现,并为新创建的进程动态分配一个task_ struct结构。

  • 相关阅读:
    SharePoint和Reporting Services整合 样式问题
    SharePoint2010安装体验(二)
    Moss 文件夹审批
    Moss中的控件—PeoplePicker
    C# 温故而知新:Stream篇(—)
    Entity Framework框架Code First Fluent API
    C# 温故而知新:Stream篇(二)
    扩展RBAC用户角色权限设计方案
    常见C#面试试题
    Spring Cloud之Ribbon负载均衡(Spring Cloud 2020.0.3版)
  • 原文地址:https://www.cnblogs.com/wwy-20135116/p/5330305.html
Copyright © 2020-2023  润新知