练习

为了实现 lab2 的目标,lab2 提供了 3 个基本练习和 2 个扩展练习,要求完成实验报告。

对实验报告的要求:

  • 基于 markdown 格式来完成,以文本方式为主
  • 填写各个基本练习中要求完成的报告内容
  • 完成实验后,请分析 ucore_lab 中提供的参考答案,并请在实验报告中说明你的实现与参考答案的区别
  • 列出你认为本实验中重要的知识点,以及与对应的 OS 原理中的知识点,并简要说明你对二者的含义,关系,差异等方面的理解(也可能出现实验中的知识点没有对应的原理知识点)
  • 列出你认为 OS 原理中很重要,但在实验中没有对应上的知识点

练习 0:填写已有实验

本实验依赖实验 1。请把你做的实验 1 的代码填入本实验中代码中有“LAB1”的注释相应部分。提示:可采用 diff 和 patch 工具进行半自动的合并(merge),也可用一些图形化的比较/merge 工具来手动合并,比如 meld,eclipse 中的 diff/merge 工具,understand 中的 diff/merge 工具等。

练习 1:实现 first-fit 连续物理内存分配算法(需要编程)

在实现 first fit 内存分配算法的回收函数时,要考虑地址连续的空闲块之间的合并操作。提示:在建立空闲页块链表时,需要按照空闲页块起始地址来排序,形成一个有序的链表。可能会修改 default_pmm.c 中的 default_init,default_init_memmap,default_alloc_pages, default_free_pages 等相关函数。请仔细查看和理解 default_pmm.c 中的注释。

请在实验报告中简要说明你的设计实现过程。请回答如下问题:

  • 你的 first fit 算法是否有进一步的改进空间

练习 2:实现寻找虚拟地址对应的页表项(需要编程)

通过设置页表和对应的页表项,可建立虚拟内存地址和物理内存地址的对应关系。其中的 get_pte 函数是设置页表项环节中的一个重要步骤。此函数找到一个虚地址对应的二级页表项的内核虚地址,如果此二级页表项不存在,则分配一个包含此项的二级页表。本练习需要补全 get_pte 函数 in kern/mm/pmm.c,实现其功能。请仔细查看和理解 get_pte 函数中的注释。get_pte 函数的调用关系图如下所示:

图 1 get_pte 函数的调用关系图

请在实验报告中简要说明你的设计实现过程。请回答如下问题:

  • 请描述页目录项(Page Directory Entry)和页表项(Page Table Entry)中每个组成部分的含义以及对 ucore 而言的潜在用处。
  • 如果 ucore 执行过程中访问内存,出现了页访问异常,请问硬件要做哪些事情?

练习 3:释放某虚地址所在的页并取消对应二级页表项的映射(需要编程)

当释放一个包含某虚地址的物理内存页时,需要让对应此物理内存页的管理数据结构 Page 做相关的清除处理,使得此物理内存页成为空闲;另外还需把表示虚地址与物理地址对应关系的二级页表项清除。请仔细查看和理解 page_remove_pte 函数中的注释。为此,需要补全在 kern/mm/pmm.c 中的 page_remove_pte 函数。page_remove_pte 函数的调用关系图如下所示:

图 2 page_remove_pte 函数的调用关系图

请在实验报告中简要说明你的设计实现过程。请回答如下问题:

  • 数据结构 Page 的全局变量(其实是一个数组)的每一项与页表中的页目录项和页表项有无对应关系?如果有,其对应关系是啥?
  • 如果希望虚拟地址与物理地址相等,则需要如何修改 lab2,完成此事? 鼓励通过编程来具体完成这个问题

扩展练习 Challenge:buddy system(伙伴系统)分配算法(需要编程)

Buddy System 算法把系统中的可用存储空间划分为存储块(Block)来进行管理, 每个存储块的大小必须是 2 的 n 次幂(Pow(2, n)), 即 1, 2, 4, 8, 16, 32, 64, 128...

  • 参考伙伴分配器的一个极简实现, 在 ucore 中实现 buddy system 分配算法,要求有比较充分的测试用例说明实现的正确性,需要有设计文档。

扩展练习 Challenge:任意大小的内存单元 slub 分配算法(需要编程)

slub 算法,实现两层架构的高效内存单元分配,第一层是基于页大小的内存分配,第二层是在第一层基础上实现基于任意大小的内存分配。可简化实现,能够体现其主体思想即可。

  • 参考linux 的 slub 分配算法/,在 ucore 中实现 slub 分配算法。要求有比较充分的测试用例说明实现的正确性,需要有设计文档。

Challenges 是选做,做一个就很好了。完成 Challenge 的同学可单独提交 Challenge。

results matching ""

    No results matching ""