kernel/proc.h

进程相关定义

kernel/proc.h中存放了绝大多数进程相关的宏与数据结构,是整个操作系统中至关重要的一部分。

上下文/语境(context)

自然,一个操作系统不能也不应该从头到尾不间歇地执行下去。如果中途发生了严重的错误,系统必须能及时停止并返回原先状态。而如果中途需要处理更重要的事务,系统还要保存当前任务的状态以便处理完后继续工作。这样的异常及中断都涉及到寄存器的变化。

context的作用便是进行寄存器的清除及恢复。它保存了基本的数据寄存器(s0~s11),同时保存了返回时需要的地址ra及栈顶指针sp。xv6一般将其与kernel/swtch.S搭配来实现切换。

// 为系统上下文切换保存寄存器
struct context {
  uint64 ra;
  uint64 sp;

  // 保存被调用方数据
  uint64 s0;
  uint64 s1;
  uint64 s2;
  uint64 s3;
  uint64 s4;
  uint64 s5;
  uint64 s6;
  uint64 s7;
  uint64 s8;
  uint64 s9;
  uint64 s10;
  uint64 s11;
};

CPU/hart

CPU为处理进程的基本的单元,但和我们平常理解的CPU略有不同。现实中的CPU指一个处理器件,内部可能有多个处理核。而在这里,CPU指的是一次处理一条指令的单线程单元,而不是特指某个硬件结构。官方文档中有时也会出现核(core)硬件线程(hart/hard thread)的术语,它们实际上指的是同一件事物。

struct CPU给出了当前CPU元数据的一个抽象表示。

这些信息被保存在CPUS中,方便查询。数目上限为NCPU(=8)。

陷阱帧(trapframe)

进程(process)

接下来的部分为本节最后也是最为关键的部分——process

一个process需要提供以下内容:

  • 便于识别与区分的身份信息:id号码...

  • 掌握的内存资源:代码的运行空间,使用的文件,占用大小,当前内存指向...;

  • 进程的状态以及相互关系:进程状态,父进程,是否被杀死...;

  • 调度接口:上下文,等待链,返回状态,锁...

最后更新于

这有帮助吗?