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

    作业信息

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

    实验

    1.在实验楼环境中执行以下命令,向MenuOS中增加fork命令,该命令调用了linux内核中的fork系统调用。然后在qume中执行help命令可以看到fork命令。

    cd LinuxKernel
    rm -rf menu
    git clone http://github.com/mengning/menu.git
    cd menu
    mv test_fork.c test.c
    


    2.开启调试模式,设置断点,查看fork函数的执行过程。

    //开启调试模式
    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
    gdb
    file linux-3.18.6/vmlinux
    target remote:1234
    //设置断点
    b sys_clone
    b do_fork
    b dup_task_struct
    b copy_process
    b copy_thread
    b ret_from_fork
    


    fork函数的执行过程,首先执行sys_clone函数,这个函数是宏命令,无法查看具体内容,接下来依次执行执行do_fork函数、copy_process函数、dup_task_struct函数、copy_thread函数、ret_from_fork函数。

    总结

    1.操作系统内核实现操作系统的三大管理功能:进程管理、内存管理、文件系统。
    2.进程的三种基本状态:就绪态、运行态、阻塞态。其进程转换转换图如下:

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

  • 相关阅读:
    Redis接口限流
    CentOS7以下DNS失效问题
    Vue的安装与使用
    使用 REDIS保存SESSION信息
    ThinkPHP 阿里云图片上传
    Laravel6.0+easywechat4.1获取用户授权例子与分享示例
    1.oracle创建本地数据库步骤及导入数据
    16、React Native实战之TextInput组件
    14.React Native实战之Navigator组件初探
    13.React Native实战之Text组件
  • 原文地址:https://www.cnblogs.com/gann/p/14014789.html
Copyright © 2011-2022 走看看