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

    作业信息

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第七周作业>
    这个作业的目标 <分析Linux内核创建一个新进程的过程>
    作业正文 https://www.cnblogs.com/matahh/p/14012929.html

    1.实验目的
    围绕对Linux系统如何创建一个新进程进行。
    仔细分析新进程的执行起点及对应的堆栈状态等。
    总结部分需要阐明自己对“Linux系统创建一个新进程”的理解。
    2.实验内容
    在MenuOS里面增加一个命令fork,只需删掉menu,然后克隆一份新的,还要把test.c给覆盖掉,menu下面执行make roofts,编译运行出来就可以看到列表中增加了一个fork。
    代码如下:

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

    结果如下:

    然后再开启第二个shell,进行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_for //一堆断点
    


    3.实验分析
    Linux系统创建一个新进程:
    进程的创建
    1.进程的创建概览及fork一个进程的用户态代码
    (1)进程的起源
    道生一(start_kernel...cpu_idle)
    一生二(kernel_init和kthreadd)
    二生三(即前面的0、1、2三个进程)
    三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先)
    (2)0号进程手工写,1号进程复制、加载init程序
    (3)shell命令行是如何启动进程的
    新进程的执行源于以下前提:
    (1)dup_task_struct中为其分配了新的堆栈
    (2)调用了sched_fork,将其置为TASK_RUNNING
    (3)copy_thread中将父进程的寄存器上下文复制给子进程,保证了父子进程的堆栈信息是一致的
    (4)将ret_from_fork的地址设置为eip寄存器的值
    (5)最终子进程从ret_from_fork开始执行
    参考文章:(https://www.cnblogs.com/zhangchao0515/p/5339964.html)

  • 相关阅读:
    AGC005D ~K Perm Counting
    运行python脚本后台执行
    java枚举类型
    java可变参数长度
    java 泛型数组列表
    java抽象类
    java final使用
    java继承
    java 对象
    java 重载
  • 原文地址:https://www.cnblogs.com/matahh/p/14012929.html
Copyright © 2011-2022 走看看