ucore lab2 实验报告
练习0:填写已有实验
本实验依赖实验1.请把你做的实验1的代码填入本实验中代码中有“LAB1”的注释相应部分。提示:可采用diff和patch工具进行半自动的合并(merge),也可用一些图形化的比较/merge工具来手动合并,比如meld,eclipse中的diff/merge工具,understand中的diff/merge工具等。
这里使用的是meld工具:
选择需要进行比较的directory进行对比。得到如下的结果:
然后根据提示信息(不同的会有小星星标记),对需要更新的代码进行Copy Right或者Copy left。这里就不细说了。
练习1:实现first-fit连续屋里内存分配算法
在实现first fit内存分配算法的回收函数时,要考虑地址连续空间之间的合并操作。在简历空闲页块链表时,需要按照空闲也快起始地址来排序,形成一个有序的的链表。
首次适应算法(First Fit):该算法从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。然后再按照需求的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。
特点: 该算法倾向于使用内存中低地址部分的空闲区,在高地址部分的空闲区很少被利用,从而保留了高地址部分的大空闲区。显然为以后到达的大作业分配大的内存空间创造了条件。
缺点:低地址部分不断被划分,留下许多难以利用、很小的空闲区,而每次查找又都从低地址部分开始,会增加查找的开销。
首先看一下Page的结构:
struct Page {
int ref; // page frame's reference counter
uint32_t flags; // array of flags that describe the status of the page frame
unsigned int property; // the num of free block, used in first fit pm manager
list_entry_t page_link; // free list link
};
typedef struct list_entry list_entry_t;
struct list_entry {
struct list_entry *prev, *next;
};
这里使用的双向链表借鉴了linux内核的双向链表结构,链表结构不包含传统数据域data,而是在具体的数据结构中包含链表节点。在本实验中,使用如下结构对页进行总体的管理。在Default.c中:
free_area_t free_area; //global page manager
#define free_list (free_area.free_list)
#define nr_free (free_area.nr_free)
free_area_t的结构,整个双向链表的头节点,同时nr_free表示空闲页的数量。
/* free_area_t - maintains a doubly linked list to record free (unused) pages */
typedef struct {
list_entry_t free_list; // the list header
unsigned int nr_free; // # of free pages in this free list
} free_area_t;
下图是整个空闲页双向链表的简易示意图:将链表和数据域隔离ÿ