OS-Lab2

OS-Lab2
Kahvia练习0
练习0:填写已有实验
本实验依赖实验1。请把你做的实验1的代码填入本实验中代码中有“LAB1”的注释相应部分。
使用 Meld Diff Viewer 将 lab1 的代码填入了 lab2 的相应位置。
练习1
练习1:实现 first-fit 连续物理内存分配算法(需要编程)
在实现first fit 内存分配算法的回收函数时,要考虑地址连续的空闲块之间的合并操作。提示:在建立空闲页块链表时,需要按照空闲页块起始地址来排序,形成一个有序的链表。可能会修改default_pmm.c中的default_init,default_init_memmap,default_alloc_pages,default_free_pages等相关函数。请仔细查看和理解default_pmm.c中的注释。
请在实验报告中简要说明你的设计实现过程。请回答如下问题:
你的first fit算法是否有进一步的改进空间
- 进入ucore操作系统之后,第一个执行的函数是 default_init_memmap,对内核进行初始化。在其中,调用了初始化物理内存的函数 pmm_init 。
- 这个函数主要是完成对于整个物理内存的初始化,页初始化只是其中的一部分,调用位置偏前,函数之后的部分可以不管,直接进入page_init函数。
- 函数 page_init 完成了一个整体物理地址的初始化过程。
- 页初始化部分,由函数 init_memmap 处理。
在 kern/mm/default_pmm.c 文件中,修改各个函数。
1
1 | static void |
2
1 | static struct Page * |
3
1 | static void |
练习2
练习2:实现寻找虚拟地址对应的页表项(需要编程)
通过设置页表和对应的页表项,可建立虚拟内存地址和物理内存地址的对应关系。其中的get_pte函数是设置页表项环节中的一个重要步骤。此函数找到一个虚地址对应的二级页表项的内核虚地址,如果此二级页表项不存在,则分配一个包含此项的二级页表。本练习需要补全get_pte函数 in kern/mm/pmm.c,实现其功能。
打开 pmm.c 文件,根据注释实现代码如下。
1 | //get_pte - get pte and return the kernel virtual address of this pte for la |
- 首先尝试使用PDX函数,获取一级页表的位置,如果获取成功,可以直接返回。
- 如果获取不成功,那么需要根据create标记位来决定是否创建这一个二级页表(注意,一级页表中,存储的都是二级页表的起始地址)。如果create为0,那么不创建,否则创建。
- 既然需要查找这个页表,那么页表的引用次数就要加一。
- 之后,需要使用memset将新建的这个页表虚拟地址,全部设置为0,因为这个页所代表的虚拟地址都没有被映射。
- 接下来是设置控制位。这里应该设置同时设置上PTE_U、PTE_W和PTE_P,分别代表用户态的软件可以读取对应地址的物理内存页内容、物理内存页内容可写、物理内存页存在。
练习3
练习3:释放某虚地址所在的页并取消对应二级页表项的映射(需要编程)
当释放一个包含某虚地址的物理内存页时,需要让对应此物理内存页的管理数据结构Page做相关的清除处理,使得此物理内存页成为空闲;另外还需把表示虚地址与物理地址对应关系的二级页表项清除。请仔细查看和理解page_remove_pte函数中的注释。为此,需要补全在
kern/mm/pmm.c中的page_remove_pte函数。page_remove_pte函数的调用关系图如下所示:
图2 page_remove_pte函数的调用关系图
请在实验报告中简要说明你的设计实现过程。请回答如下问题:
数据结构Page的全局变量(其实是一个数组)的每一项与页表中的页目录项和页表项有无对应关系?如果有,其对应关系是啥?
如果希望虚拟地址与物理地址相等,则需要如何修改lab2,完成此事? 鼓励通过编程来具体完成这个问题
1
page_remove_pte函数补全如下。
1 | //page_remove_pte - free an Page sturct which is related linear address la |
先判断该页被引用的次数,如果只被引用了一次,那么直接释放掉这页, 否则就删掉二级页表的该表项,即该页的入口。我们先将物理页的引用数目减一,如果变为零,那么释放页面;然后将页目录项清零,刷新页表,即可取消页表映射。
2
数据结构Page的全局变量的每一项与页表中的页目录项和页表项有关系。数据结构page是最低级的页表,目录项是一级页表,存储的内容是页表项的起始地址(二级页表),而页表项是二级页表,存储的是每个页表的开始地址,这些内容之间的关系时通过线性地址高低位不同功能的寻址体现的。
3
物理地址和虚拟地址之间存在一定偏移offset,通常,这个offset,就是KERNBASE,是由操作系统决定的,而ucore中,定义在(kern/mm/memlayout.h)。KERNBASE为虚拟地址空间中的内核基址,即偏移量。如果想要让虚拟地址与物理地址相等,就需要修改偏移值为0。
修改位置如图所示。