2020-2021-1 20209302毕慧敏 《Linux内核原理与分析》第七周作业

进程的描述和进程的创建

作业信息

这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/11511045.html#第七周作业
这个作业的目标 <对Linux系统如何创建一个新进程进行追踪>
作业正文 https://www.cnblogs.com/augusts/p/14021367.html

实验楼实验六

1.进程的描述

操作系统内核实现操作系统的三大管理功能:进程管理,内核管理和文件系统,其中最核心的功能是进程管理。
在操作系统原理中,我们通过进程控制块PCB描述进程,通常采用一个数据结构struct task_struct来描述进程,其中比较常见的属性如state是进程状态,常见状态有就绪态,运行态和阻塞态,其运行过程如图所示:

操作系统内核实现操作系统的三大管理功能,即进程管理、内存管理和文件系统,对应操作系统原理课程中最重要的3个抽象概念是进程、虚报内存和文件。其中,我作系统内核中最核心的功能是进程管理。谈到进程管理就要涉及一个问题:进程是怎样描述的? 进程的描述有提纲挈领的作用,它可以把内存管理、文件系统、信号、 进程间通信等概念 和内容串起来。Linux 内核中的进程是非常复杂的,在操作系统原理中,我们通过进程控制块PCB描述进程。为了管理进程,内核要描述进程的结构,我们也称其为进程描述符,进程描述符提供了进程相关的所有信息。

2.进程的创建

先对实验楼环境进行修改,删除menu,在github上克隆一份新的,并且把test.c覆盖,在menu下执行make rootfs,编译运行结果如下所示:

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

退出menu目录,在LinuxKernel目录下执行

  qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s

然后打开shell2,进行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处,继续执行,找到其余断点

总结

本文主要学习了Linux内核系统创建新子进程,并通过gdb和代码分析了调用过程。一般情况下,调用系统调用需在当前内核linux-3.18.6/arch/x86/syscalls/syscall_32.tbl中查找调用号,库函数sys_fork是用户态创建子进程的系统调用,此外可能会使用到sys_vfork sys_clone系统调用,但是这三个系统调用都会调用do_fork函数,本文中使用了sys_clone。do_fork会调用copy_process来复制父进程的资源给子进程。在copy_process中有各种函数来进行复制初始化工作。完成各项工作之后会执行ret_from_fork,这是子进程的起点,运行,子进程可以执行并显示在终端中。总结来讲,进程的创建过程大致是赋值进程描述符,复制其他进程资源,分配子进程的内核堆栈并对内核堆栈关键信息进行初始化。

原文地址:https://www.cnblogs.com/augusts/p/14021367.html