@JudyYe
2016-03-25T14:25:14.000000Z
字数 2228
阅读 479
UCORE_REPORT
为了实现lab2的目标,lab2提供了3个基本练习和2个扩展练习,要求完成实验报告。
对实验报告的要求:
本实验依赖实验1。请把你做的实验1的代码填入本实验中代码中有“LAB1”的注释相应部分。提示:可采用diff和patch工具进行半自动的合并(merge),也可用一些图形化的比较/merge工具来手动合并,比如meld,eclipse中的diff/merge工具,understand中的diff/merge工具等。
我使用了meld手动合并。done
在实现first fit 内存分配算法的回收函数时,要考虑地址连续的空闲块之间的合并操作。提示:在建立空闲页块链表时,需要按照空闲页块起始地址来排序,形成一个有序的链表。可能会修改default_pmm.c中的default_init,default_init_memmap,default_alloc_pages, default_free_pages等相关函数。请仔细查看和理解default_pmm.c中的注释。
请在实验报告中简要说明你的设计实现过程。请回答如下问题:
你的first fit算法是否有进一步的改进空间
我的first fit算法实现在了已有代码上,做了完善。
原有代码只是没有对双向链表按照地址排序。所以我的工作只有:
在free_page中
nr_free += n;
le = &free_list;
while((le = list_next(le)) != &free_list) {
p = le2page(le, page_link);
if (p > base) {
break;
}
}
list_add_before(le, &(base->page_link));
还有就是,在alloc和free时,处理了一些原来代码没有做好的SetPageProperty
与参考答案区别
发现参考答案中,是把每一个空闲页都加入了free_list,但是这样的效率并不高。我遵从原有代码的设计,只把一段连续内存的第一个页加入free_list这样在遍历的时候,可以提高算法复杂度的常数。
通过设置页表和对应的页表项,可建立虚拟内存地址和物理内存地址的对应关系。其中的get_pte函数是设置页表项环节中的一个重要步骤。此函数找到一个虚地址对应的二级页表项的内核虚地址,如果此二级页表项不存在,则分配一个包含此项的二级页表。本练习需要补全get_pte函数 in kern/mm/pmm.c,实现其功能。请仔细查看和理解get_pte函数中的注释。
请在实验报告中简要说明你的设计实现过程。请回答如下问题:
请描述页目录项(Pag Director Entry)和页表(Page Table Entry)中每个组成部分的含义和以及对ucore而言的潜在用处。
如果ucore执行过程中访问内存,出现了页访问异常,请问硬件要做哪些事情?
页目录项和页表项都由两部分组成
addr | 标志位
标志位的意义都相同:
PTE_W 表示是否可写
PTE_U 表示是否用户态可访问
PTE_P 表示该页是否有映射关系以及该页是否存在。
页目录项中的addr表示页表基址,页表项中的addr表示物理地址。
出现页访问异常的时候,硬件需要做的事情:
1. 切换到内核态
2. 记录现场
3. 跳转到异常处理程序
3. 如果是缺页异常并且允许建立映射,就建立映射,然后返回
4. 如果启用了虚存机制并且可以调入内存,就进行虚存的置换。
5. 否则panic退出。
当释放一个包含某虚地址的物理内存页时,需要让对应此物理内存页的管理数据结构Page做相关的清除处理,使得此物理内存页成为空闲;另外还需把表示虚地址与物理地址对应关系的二级页表项清除。请仔细查看和理解page_remove_pte函数中的注释。为此,需要补全在 kern/mm/pmm.c中的page_remove_pte函数。
请在实验报告中简要说明你的设计实现过程。请回答如下问题:
数据结构Page的全局变量(其实是一个数组)的每一项与页表中的页目录项和页表项有无对应关系?如果有,其对应关系是啥?
page的起始地址由三部分组成pde|pte|offset
根据pde查页目录项,查到的页表地址+pte找到对应的页表项,再用其中的物理帧号+offset,就可以得到实际地址。
多个Page可以指向同一个页表项,这样实现代码段的共享。一个Page在同一个进程中只能指向唯一一个确定的页表项,但是也可能找不到对应关系。这时引发缺页异常。
如果希望虚拟地址与物理地址相等,则需要如何修改lab2,完成此事? 鼓励通过编程来具体完成这个问题
如果希望虚拟地址与物理地址相等,则需要把kernel的偏移从现在的0xc0000000改成0x00000000;