Skip to content

实验任务

实验任务

练习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函数(kern/mm/pmm.c中),实现其功能。请仔细查看和理解get_pte函数中的注释。get_pte函数的调用关系图如下所示:

图1 get_pte函数的调用关系图

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

- 请描述页目录项(Page Directory Entry)和页表项(Page Table Entry)中每个组成部分的含义以及对ucore而言的潜在用处。

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

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

图2 page_remove_pte函数的调用关系图

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

- 数据结构Page的全局变量(其实是一个数组)的每一项与页表中的页目录项和页表项有无对应关系?如果有,其对应关系是啥?

实验要求

  1. 完成以上三个练习,给出编译运行后输出结果的截图。并在实验报告中对所写代码调用的函数的作用加以说明。

  2. 需提交可以在我们给定的Docker环境中直接使用make qemu编译并运行的文件夹的压缩包。


Last update: 2024年5月14日