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

    作业信息

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第七周作业>
    这个作业的目标 <写上具体方面>
    作业正文 https://i.cnblogs.com/posts/edit;postId=13913848

    进程的描述与进程的创建

    进程描述

    操作系统有三大管理功能:

    • 进程管理
    • 内存管理
    • 文件系统

    进程的状态:

    • 运行状态(runing):并不意味着进程一定在运行中,也可以在运行队列里;
    • 睡眠状态(sleeping):进程在等待事件完成;(浅度睡眠,可以被唤醒)
    • 磁盘睡眠状态(Disk sleep):不可中断睡眠(深度睡眠,不可以被唤醒,通常在磁盘写入时发生)
    • 停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止进程,可以发送SIGCONT信号让进程继续运行
    • 死亡状态(dead):该状态是返回状态,在任务列表中看不到;
    • 僵尸状态(zombie):子进程退出,父进程还在运行,但是父进程没有读到子进程的退出状态,子进程进入僵尸状态;
    • t追踪停止状态(trancing stop)

    在linux下,进程三种主要状态:

    • 就绪态
    • 运行态
    • 阻塞状态

    进程创建

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

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

    实验过程

    执行以下代码:

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

    编译运行出来看到列表中新增了fork

    接下来启动gdb准备跟踪调试内核程序:
    执行:

     file linux-3.18.6/vmlinux
     target remote:1234
    

    此时出现以下错误:

    这个错误犯得有点低级,因为刚刚是make roofts加载的内核,没有加-s参数,自然无法连接到1234端口,重新加上-s参数后问题解决

    执行以下代码添加断点

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

    继续运行内核程序,在代码行中输入c,会找到设置的第一个断点do_fork。

    继续找到剩余的几个断点,对其进行跟踪。

  • 相关阅读:
    C# Task ContinueWith的实现
    C# Task 是什么?返回值如何实现? Wait如何实现
    C# ExecutionContext 实现
    C# Barrier 实现
    C# CountdownEvent实现
    C# SemaphoreSlim 实现
    C# ManualResetEventSlim 实现
    C# Monitor实现
    C# SpinLock实现
    C# SpinWait 实现
  • 原文地址:https://www.cnblogs.com/mazhuhong/p/13913848.html
Copyright © 2011-2022 走看看