=======
NOTICE
- 有"w5l2"标记的题是助教要提交到学堂在线上的。
- 有"w5l2"和"spoc"标记的题是要求拿清华学分的同学要在实体课上完成,并按时提交到学生对应的git repo上。
- 有"hard"标记的题有一定难度,鼓励实现。
- 有"easy"标记的题很容易实现,鼓励实现。
- 有"midd"标记的题是一般水平,鼓励实现。
(1)缺页异常的处理流程?
(2)从外存的页面的存储和访问代码?
(3)缺页和页访问非法的返回地址有什么不同?
硬件设置、软件可修改; 中断号是
(4)虚拟内存管理中是否用到了段机制
(5)ucore如何知道页访问异常的地址?
(6)中断处理例程的段表在GDT还是LDT?
(7)物理内存管理的数据结构在哪?
(8)页表项的结构?
(9)页表项的修改代码?
(10)如何设置一个虚拟地址到物理地址的映射关系?
(11)为了建立虚拟内存管理,需要在哪个数据结构中表示“合法”虚拟内存
(12)swap_init()做了些什么?
(13)vmm_init()做了些什么?
(14)vma_struct数据结构的功能?
(15)mmap_list是什么列表?
(16)外存中的页面后备如何找到?
(17)vma_struct和mm_struct的关系是什么?
合法的连续虚拟地址区域、整个进程的地址空间
(18)画数据结构图,描述进程的虚拟地址空间、页表项、物理页面和后备页面的关系;
(19)页面不在内存和页面访问非法的处理中有什么区别?对应的代码区别在哪?
(20)find_vma()做了些什么?
(21)swapfs_read()做了些什么?
(22)缺页时的页面创建代码在哪?
(23)struct rb_tree数据结构的原理是什么?在虚拟管理中如何用它的?
(24)页目录项和页表项的dirty bit是何时,由谁置1的?
(25)页目录项和页表项的access bit是何时,由谁置1的?
(26)虚拟页与磁盘后备页面的对应有关系?
(27)如果在开始加载可执行文件时,如何改?
(28)check_swap()做了些什么检查?
(29)swap_entry_t数据结构做什么用的?放在什么地方?
(30)空闲物理页面的组织数据结构是什么?
(21)置换算法的接口数据结构?
swap_manager
================
(1)(spoc) 请参考lab3_result的代码,思考如何在lab3_results中实现clock算法,并给出你的概要设计方案,可4人一个小组,说明你的方案中clock算法与LRU算法上相比,潜在的性能差异性。并进一说明LRU算法在lab3实现的可能性评价(给出理由)。
ucore中的实现是FIFO算法,具体实现在swap_fifo.c中。和物理内存的管理一样,替换算法也是采用一个manager来实现的(swap.h),有函数指针指向不同的实际swap函数。因此,如果需要实现clock或者lru的算法,则需要在新建swap_clock.c的文件,参照swap_fifo.c的接口实现置换算法,包括_fifo_swap_out_victim等函数,然后在swap_manager的初始化过程中,将函数指针指向新定义的函数即可
clock算法需要维护一个循环链表,保存当前内存中内容,以及它们是否被访问过理论上比LRU算法效果差,因为LRU算法不仅保存了内存中的信息是否被访问了,而且还保存了什么时间访问的但是在lab3中实现LRU算法的话,实际性能可能不高因为缺乏高效数据结构的支持,因为只有链表结构的话,不能很好地解决LRU算法的查找最长时间没被访问的块的问题
(2)(spoc) 理解内存访问的异常。在x86中内存访问会受到段机制和页机制的两层保护,请基于lab3_results的代码(包括lab1的challenge练习实现),请实践并分析出段机制和页机制各种内存非法访问的后果。,可4人一个小组,,找出尽可能多的各种内存访问异常,并在代码中给出实现和测试用例,在执行了测试用例后,ucore能够显示出是出现了哪种异常和尽量详细的错误信息。请在说明文档中指出:某种内存访问异常的原因,硬件的处理过程,以及OS如何处理,是否可以利用做其他有用的事情(比如提供比物理空间更大的虚拟空间)?哪些段异常是否可取消,并用页异常取代?
可能的异常:
-
试图用一个超过段界限的偏移量访问段
-
将一个不可执行的段装入CS寄存器
-
将一个只执行段装入除CS寄存器外的其他段寄存器
-
写只读段
-
使用空选择子
-
低优先级代码访问高优先级的段
-
没有设置GDT/段不存在
-
stack段不存在
-
没有合法的TSS
-
没有设置IDT
-
访问的地址没有对齐
-
访问的是非法指令
-
写只读页
-
低优先级代码访问高优先级的页
-
页目录项映射不存在
-
页表项映射不存在