PCB块,理解为一个结构体,如下所示:
struct PCB {
struct Trapframe env_tf; // Saved registers
struct Env *env_link; // Next free Env
envid_t env_id; // Unique environment identifier
envid_t env_parent_id; // env_id of this env's parent
enum EnvType env_type; // Indicates special system environments
unsigned env_status; // Status of the environment
uint32_t env_runs; // Number of times environment has run
pde_t *env_pgdir; // Kernel virtual address of page dir
};
env_tf
这个结构体是用于保存进程寄存器的值。当从user转变到kernel模式的时候,kernel将寄存器的值保存下来,这样子这个进程可以从它离开的地方重新开始。
env_link
指向空闲进程链表上的下一个空闲的进程,env_free_list是指向list中第一个空闲进程。
env_id
唯一标志着当前正在使用这个PCB结构体的进程(可以理解成PID)。
env_parent_id
代表创建这个environment的environment的env_id(相当于一个进程中的父进程id)。通过这种id,environment可以成一个“family tree”,这在决定一个environment允许给谁做什么的时候是相当有用的
env_pgdir
页目录的内核虚拟地址
类似Unix 内核,一个JOS environment也将“thread”和“address space”的概念耦合起来。
thread主要由保存的寄存器值定义(env_tf),addree space>由页目表和页表来定义(env_pgdir)。
要想真正的运行一个环境,kernel必须用保存的寄存器的值和合适的address space设置好CPU。