练习0 填写已有实验
本实验依赖实验1~实验3。请把已做的实验1~实验3的代码填入本实验中代码中有lab1,lab2,lab3的注释部分。
运用meld软件进行比较,截图如下:
可以看到,需要补全的文件是
default_pmm.c
pmm.c
swap_fifo.c
vmm.c
trap.c
练习1 分配并初始化一个进程控制块(需要编码)
alloc_proc函数(位于kern/process/proc.c中)负责分配并返回一个新的struct proc_struct结构,用于存储新建立的内核线程的管理信息。ucore需要对这个结构进行最基本的初始化,完成这个初始化过程。
关键数据结构 struct proc_struct
struct proc_struct {
enum proc_state state; // Process state
int pid; // Process ID
int runs; // the running times of Proces
uintptr_t kstack; // Process kernel stack
volatile bool need_resched; // need to be rescheduled to release CPU?
struct proc_struct *parent; // the parent process
struct mm_struct *mm; // Process's memory management field
struct context context; // Switch here to run process
struct trapframe *tf; // Trap frame for current interrupt
uintptr_t cr3; // the base addr of Page Directroy Table(PDT)
uint32_t flags; // Process flag
char name[PROC_NAME_LEN + 1]; // Process name
list_entry_t list_link; // Process link list
list_entry_t hash_link; // Process hash list
};
下面对参数进行简单的讲解
mm:内存管理的信息,包括内存映射列表、页表指针等。
state:进程所处的状态。
parent:用户进程的父进程(创建它的进程)。
kstack:记录了分配给该进程/线程的内核桟的位置。
need_resched:是否需要调度
context:进程的上下文,用于进程切换
tf:中断帧的指针
cr3: cr3 保存页表的物理地址
代码填写
根据题目中的提示填写代码
static struct proc_struct *
alloc_proc(void) {
struct proc_struct *proc = kmalloc(sizeof(struct proc_struct));
if (proc != NULL) {
//LAB4:EXERCISE1 YOUR CODE
/*
* below fields in proc_struct need to be initialized
* enum proc_state state; // Proc