MIT_6.828_LAB2_Part1

LAB2:内存管理

1.简介

本实验中,我们将为操作系统编写内存管理代码,内存管理包括两个部分,第一个部分是内核的物理内存分配器,它能让内核得以分配和释放物理内存,编写的分配器应以4096字节(一页)为一个操作单位,我们的任务是维护一个数据结构,记录哪些物理页是空闲的,哪些是已分配的,以及共享每个已分配页面的进程数,我们还要编写分配和释放内存页面的例程。内存管理的第二个部分是虚拟内存,它将内核和用户软件使用的虚拟地址映射到物理内存上,当指令使用内存时,x86硬件的内存管理单元(MMU)执行映射,查询一组页表。 我们将根据课程提供的规定修改JOS以设置MMU的页表。

2.预备工作

在开始实验前,我们需要根据课程提示获取并切换到LAB2分支,LAB2中包含了以下新源文件:
inc/memlayout.h
kern/pmap.c
kern/pmap.h
kern/kclock.h
kern/kclock.c
memlayout.h描述了必须通过修改pmap.c来实现的虚拟地址空间的布局。 memlayout.h和pmap.h定义了PageInfo结构体,我们将使用该结构体来跟踪哪些物理内存页可用。 kclock.c和kclock.h操纵PC的电池供电时钟和CMOS RAM硬件,其中BIOS记录PC包含的物理内存量等。要特别注意memlayout.h和pmap.h,此练习要求我们使用和理解它们包含的许多定义。另外inc / mmu.h也包含许多对本练习有用的定义。

Part1.Physical Page Management(物理内存页管理)

操作系统要能跟踪那些物理RAM是空闲的,哪些是正在使用的,JOS以页为粒度管理计算机的物理内存,以便它可以使用MMU映射和保护每个已被分配的内存页。
我们现在将编写物理页分配器,它通过struct PageInfo对象的链接列表来跟踪哪些页面是空闲的,每个页面都对应于一个物理页面。 我们需要先编写物理页面分配器,然后才能编写其余的虚拟内存实现

练习1:实现kern/pmap.c中的下列函数
boot_alloc()
mem_init() (only up to the call to check_page_free_list(1))
page_init()
page_alloc()
page_free()
check_page_free_list() and check_page_alloc()可以测试你的物理分页器

(1)boot_alloc函数仅在JOS设置它的虚拟内存系统时被调用,page_alloc才是真正的页面分配器,end指向.bss段的末尾,链接器未分配任何内核代码和全局变量的第一个虚拟地址,该函数的核心作用就是维护一个nextfree指针,该指针指向下一块可用的空闲虚拟内存,ROUNDUP函数的作用是向上取整,保证分配的内存按页面对齐,nextfree的初始化在源代码中已经给出,我们按注释填充剩下的代码即可:
在这里插入图片描述

(2)mem_init函数中要求我们补充初始化pageinfo结构体数组的代码,首先使用boot_alloc为其分配足够的内存空间,然后将数据初始化为0即可
MIT_6.828_LAB2_Part1_第1张图片
(3)page_init函数要求我们补充初始化page_free_list和pageinfo数组的代码,按照注释将不可用或已被使用的页面对应的pageinfo结构体的pp_ref设置为1,空闲页面以倒插的方式插入page_free_list链表中即可
MIT_6.828_LAB2_Part1_第2张图片
(4)page_alloc函数的作用是从空闲页链表中摘下一个分配出去,并返回对应的pageinfo结构体,另外当alloc_flag为1时,要将对应页面的数据初始化为0
MIT_6.828_LAB2_Part1_第3张图片
(5)page_free函数的作用是释放一个页面,将其加入空闲页链表,当且仅当pp_ref为0且pp_link为NULL时,页面才能加入链表。
MIT_6.828_LAB2_Part1_第4张图片

上述函数的补充工作已经完成了,那么接下来执行make qemu进行测试就行啦,第一次测试发现check_page_alloc不成功:
图片这是因为Page_alloc函数中在分配页面后,我把对应page_info的pp_ref修改成了1,开始认为这个变量是用来标志页面是否空闲的,实际上该变量代表物理页到虚拟地址的映射次数,把修改pp_ref的代码注释掉后,check_page_alloc就能成功通过啦。
在这里插入图片描述

你可能感兴趣的:(操作系统)