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

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第七周作业>
    这个作业的目标 <分析Linux内核创建一个新进程的过程>
    作业正文 本博客链接

    实验过程

    给MenuOS添加一个fork命令,该命令调用了linux内核中的fork系统调用。

    相应的fork调用如上。
    修改相应的Makefile文件,使得qemu得以调试:

    开启相应的gdb调试:

    相应的对以下函数设置断点:

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

    进入调试:

    分析

    Linux中创建进程有三个函数:

    fork       //创建子进程。
    clone      //主要用于创建线程。
    vfork      //与fork类似,但是父子进程共享地址空间,而且子进程先于父进程运行
    

    Linux中创建进程一共有三个函数:fork,创建子进程 vfork,与fork类似,但是父子进程共享地址空间,而且子进程先于父进程运行。 clone,主要用于创建线程。Linux中所有的进程创建都是基于复制的方式,Linux通过复制父进程来创建一个新进程,通过调用do_ fork来实现。然后对子进程做一些特殊的处理。而Linux中的线程,又是一种特殊的进程。根据代码的分析,do_ fork中,copy_ process管子进程运行的准备,wake_ up_ new_ task作为子进程forking的完成。fork()函数最大的特点就是被调用一次,返回两次。
    do_fork大概做了这么几件事情:
    (1)调用copy_process,将当期进程复制一份出来为子进程,并且为子进程设置相应地上下文信息。
    (2)初始化vfork的完成处理信息(如果是vfork调用)
    (3)调用wake_up_new_task,将子进程放入调度器的队列中,此时的子进程就可以被调度进程选中,得以运行。
    (4)如果是vfork调用,需要阻塞父进程,直到子进程执行exec。
    状态以及之间的转换关系如图所示:

  • 相关阅读:
    BIOS中的UEFI和Legacy启动模式
    php和java中的加密和解密
    Linux 的进程状态
    C++继承:公有,私有,保护
    编译器在构造函数里都做了些什么?
    操作符重载
    C++对象模型学习笔记
    sizeof操作符-结构体与类大小
    C++之智能指针
    C/C++笔试题整理
  • 原文地址:https://www.cnblogs.com/yanzs/p/14017854.html
Copyright © 2011-2022 走看看