2020-2021-1 20209327 《Linux内核原理与分析》第七周作业

进程的描述和进程的创建

作业信息

这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第七周作业>
这个作业的目标 在MenuOS中增加命令fork、跟踪分析进程创建的过程
作业正文 https://www.cnblogs.com/TracerElena/p/14012739.html

在MenuOS中增加命令fork

在shell1中执行以下命令,向MenuOS中增加fork命令以创建进程:

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

MenuOS运行效果如下,可以看到已经增加了一条创建进程的fork命令。

跟踪分析进程创建的过程

在shell2中进行gdb调试:

gdb
file linux-3.18.6/vmlinux
target remote:1234

在sys_clone、do_fork、dup_task_struct、copy_process、copy_thread、ret_from_fork等处设置断点:

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

设置完断点后执行,停在了do_fork处

继续执行,找到其余断点

总结

  1. 操作系统内核实现操作系统的三大管理功能:
  • 进程管理
  • 内存管理
  • 文件系统
  1. 进程的三种基本状态:
  • 就绪态
  • 运行态
  • 阻塞态

在Linux内核中,当进程是TASK_RUNNING状态时,它是可运行的,处于就绪态。当进程获得CPU的控制权,在CPU中实际执行时,它处于运行态。当进程被内核调度出去,在等待队列里就是就绪态。一个正在运行的进程在等待特定的事件或资源时会进入阻塞态。

  1. do_fork函数的参数:
  • clone_flags:子进程创建相关标志,通过此标志可以对父进程的资源进行有选择的复制
  • stack_start:子进程用户态堆栈的地址
  • regs:指向pt_regs结构体的指针
  • stack_size:用户态栈的大小,通常是不必要的,总被设置为0
  • parent_tidptr和child_tidptr:父进程子进程用户态下的pid地址
  1. 创建一个进程是复制当前进程的信息,即fork一个进程就是创建了一个新进程。父进程和子进程的绝大部分信息是完全一样的,但是pid的值和内核堆栈等信息是不能一样的。在fork一个子进程的过程中,复制父进程的资源时采用Copy On Write技术,不需要修改进程资源,父子进程共享内存存储空间。
posted @ 2020-11-20 19:56  20209327  阅读(114)  评论(0编辑  收藏  举报