《Linux内核原理与分析》第七周作业

课本:第六章 进程的描述和进程的创建

  • 操作系统内核实现操作系统的三大管理功能
    • 进程管理
    • 内存管理
    • 文件系统
  • 在操作系统原理中,通过进程控制块PCB描述进程;在Linux内核中,通过一个数据结构struct task_struct来描述进程。
  • 在操作系统原理中,进程有就绪态、运行态和阻塞态;在Linux内核中,就绪态和运行态都是相同的TASK_RUNNING状态另加上一个阻塞态。在Linux内核中,当进程是TASK_RUNNING状态时,它是可运行的,就是就绪态,是否在运行取决于它有没有获得CPU的控制权。
  • 对于一个正在运行的进程,调用用户态库函数exit()会陷入内核执行该内核函数do_exit(),进程会进入TASK_ZOMBIE状态,即中止状态,Linux内核会在适当的时候把该进程处理掉,后释放进程描述符。一个正在运行的进程在等待特定事件或资源时会进入阻塞态,阻塞态分为两种:TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE。前者可以被信号和wake_up()唤醒,后者只能被wake_up()唤醒。进程状态转换图如下图所示:
  • 在进程描述符中用pid和tgid标识进程。
  • 在进程的创建时,0号进程init_task的初始化是通过硬编码方式固定下来的,除此之外,所有其他进程的初始化都是通过do_fork复制父进程的方式初始化的。
  • Linux内核中,数据结构struct thread_struct用来保存进程上下文中CPU相关的一些状态信息,其内部最关键的是sp和ip,在x86-32位系统中,sp用来保存进程上下文中的ESP寄存器状态,ip用来保存进程上下文中的EIP寄存器状态。
  • fork系统调用把当前进程又复制了一个子进程,也就一个进程变成了两个进程,两个进程执行相同的代码,只是fork系统调用在父进程和子进程中的返回值不同。
  • fork、vfork和clone这三个系统调用和kernel_thread内核函数都可以创建一个新进程,而且都是通过do_fork函数来创建进程的,只不过传递的参数不同。
  • do_fork函数的参数:
    • clone_flags:子进程创建相关标志,通过此标志可以对父进程的资源进行有选择的复制。
    • stack_start:子进程用户态堆栈的地址。
    • regs:指向pt_regs结构体的指针。当发生系统调用时,int指令和SAVE_ALL保存现场等会将CPU寄存器中的值按顺序压入内核栈。为了便于访问操作,这部分数据被定义为pt_regs结构体。
    • stack_size:用户态栈的大小,通常不必要,设置为0。
    • parent_tidptr和child_tidptr:父进程、子进程用户态下的pid地址。
  • 进程的创建中几个关键函数:
    • do_fork():创建进程
    • copy_process():创建进程内容
    • dup_task_struct():复制进程描述符、信息检查、初始化、更改进程状态、复制其他进程资源、调用copy_thread初始化子进程内核栈、设置子进程pid等
    • copy_thread():内核栈关键信息初始化

实验:分析Linux内核创建一个新进程的过程

猜你喜欢

转载自www.cnblogs.com/intoxication/p/10012710.html