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。

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

原文地址:https://www.cnblogs.com/mazhuhong/p/13913848.html