解析一个简单的PCB块内部结构

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。

你可能感兴趣的:(linux,PCB)