zoukankan      html  css  js  c++  java
  • 2019-2020-1 20209329《Linux内核原理与分析》第七周作业

    作业信息

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第七周作业>
    这个作业的目标 <在MenuOS中增加命令fork、跟踪分析进程创建的过程>
    作业正文 https://www.cnblogs.com/Alannic/p/14015724.html

    进程的描述和进程的创建

    在MenuOS中增加命令fork

    利用实验楼环境执行以下命令,向MenuOS中增加fork命令

    cd ~/LinuxKernel
    rm -rf menu
    git clone https://github.com/mengning/menu.git
    cd menu 
    mv test_fork.c test.c
    make rootfs
    

    可见新的文件系统里面已经存在fork命令了。

    跟踪分析进程创建的过程

    首先在shell中输入以下命令

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

    水平新建一个shell,输入以下命令利用gdb进行调试

    gdb
    file linux-3.18.6/vmlinux
    target remote:1234
    

    在sys_clone、do_fork、dup_task_struct、copy_process、copy_thread、ret_from_fork等处设置断点:

    b sys_clone
    b do_fork
    b dup_task_struct
    b copy_process
    b copy_thread
    b ret_from_fork
    

    在gdb上输入c继续执行,然后再menu里面输入fork命令,可以看到命令停在了do_fork上

    继续执行,停止了copy_process

    继续执行,陆续停在了dup_task_struct、copy_thread、ret_from_fork上

    总结

    进程的创建就是从已有的进程中复制出一个新进程,其中父进程和子进程的绝大部分信息是一样的,有些信息则不能一样,比如pid的值和内核堆栈。还有将新进程连接到各种链表中,要保存进程执行到哪个位置,有一个thread数据结构记录ip和sp等信息也不能一样,否则将会发生问题。父进程创建一个子进程,应该会有一个地方复制了父进程的进程描述符Task_struct结构体变量,并有很多地方来修改复制出来的进程描述符结构体变量。因为父子进程各自都有很多自己独立的个性,子进程应该有很多地方修改内核堆栈里的信息,因为内核堆栈里的很多数据是从父进程复制来的,而fork系统调用在父子进程中分别返回到用户态,父子进程的内核堆栈中可能某些信息也不完全一样。还有thread,根据子进程复制的父进程的内核堆栈的状况,肯定要设定好EIP和ESP寄存器,即设定好子进程开始执行的位置。fork一个子进程的过程中,复制父进程的资源时采用了Copy On Write(写时复制)技术,不需要修改进程资源,父子进程是共享内存存储空间的。

  • 相关阅读:
    Vue自定义指令 directive
    Vue过滤器 filters
    贪心
    家庭作业
    线段
    数列极差
    shell
    智力大冲浪
    加工生产调度
    喷水装置
  • 原文地址:https://www.cnblogs.com/Alannic/p/14015724.html
Copyright © 2011-2022 走看看