Lab2
Exercise0:填写已有实验
使用meld将lab1中的代码填入实验中
Exercise1:实现 first-fit 连续物理内存分配算法
default_init()
static void
default_init(void) {
list_init(&free_list);
nr_free = 0;
}
这个函数的正确代码已经给出,不需要进行修改。
函数的作用是对free_list进行初始化,对free_list 的头结点进行初始化,并且把free_list 中的nr_free设置为0,也就是把当前的空闲页中空闲页的数量先初始化为0。
default_init_memmap(struct Page *base, size_t n)
static void
default_init_memmap(struct Page *base, size_t n) {
assert(n > 0);
struct Page *p = base;
for (; p != base + n; p ++) {
assert(PageReserved(p));//检查是否是保留页
p->flags = p->property = 0;//设置标志位和property为0
set_page_ref(p, 0);//将此页的引用计数设为零
}
base->property = n;//初始化块首的property为整个free_list的大小
SetPageProperty(base);//将块首的标志位设置为free
nr_free += n;//把free_list中的空闲块数量设置为n
list_add_before(&free_list, &(base->page_link));//最后把整个空闲块加到free_area_t 中
}
这个函数的代码也已经给出,但其中有一些小的问题
问题出在把以base为头的整个空闲页链表加到free_list中时,最初给出的代码是把整个块加到头指针的后面,我把这里改成了加在头的前面,由于这是个双向循环链表,并且刚刚初始化,还是个空的链表,所以两个方法的结果是相同的,但是意义却是不同的。
在这几行代码中有些需要注意的地方:
p->flags = p->property = 0;//设置标志位</