作业信息
这个作业属于哪个课程 | <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。
继续找到剩余的几个断点,对其进行跟踪。