操作系统lab2实验报告Word文件下载.docx
- 文档编号:19899000
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:11
- 大小:1.23MB
操作系统lab2实验报告Word文件下载.docx
《操作系统lab2实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统lab2实验报告Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
三、实验设计思想和练习题
练习0:
填写已有实验
使用eclipse中的diff/merge工具将实验1的代码填入本实验中代码中有“LAB1”的注释相应部分。
练习1:
实现first-fit连续物理内存分配算法(需要编程)
在实现firstfit内存分配算法的回收函数时,要考虑地址连续的空闲块之间的合并操作。
提示:
在建立空闲页
B.所有的连续内存空闲块可用一个双向链表管理,利用一个free_area_t结构体表示,查看kern/mm/memlayout.h包括:
list_entry:
双向链表指针,指向空闲的物理页;
nr_free:
记录当前空闲页的个数的无符号整形变量。
(2)连续物理内存分配思路:
物理内存页管理器顺着双向链表进行搜索空闲内存区域,直到找到一个足够大的空闲区域,这是一种速度很快的算法,因为它尽可能少地搜索链表。
如果空闲区域的大小和申请分配的大小正好一样,则把这个空闲区域分配出去,成功返回;
否则将该空闲区分为两部分,一部分区域与申请分配的大小相等,把它分配出去,剩下的一部分区域形成新的空闲区。
其释放内存的设计思路是把这块区域重新放回双向链表中。
(3)具体设计:
bootloader进行探测物理格局后,利用kern_entry()函数设置堆栈,并临时建立一个段映射关系,调用kern_init()函数输出检查后,pmm_init()函数完成物理内存的管理,假定page_init()函数是按照地址从小到大的顺序传递连续内存空闲块,根据page_init()函数中传递的参数(某个连续的空闲块的起始页,页个数),default_init_memmap()来建立一个连续内存空闲块的双向链表,链表头设free_area.free_list,链表项设Page的base->
page_link。
代码分析:
(1)default_init_memmap:
用于构建空闲页链表;
A.步骤:
(1)初始化每一个空闲页,注意使用头插法是因为地址是从低到高地址增长;
(2)计算空闲页的总数。
B.具体实现:
(2)default_alloc_pages:
用于为进程分配空闲页;
(1)从空闲链表表头开始查找最小的地址,寻找足够大的空闲块;
(2)如果找到,获得指向分配的页,重新设置标志位,从空闲链表中删除此页;
(3)判断空闲块大小是否合适;
(4)如果合适,不操作;
如果不合适,分割页块;
(5)计算剩余空闲页个数,返回分配的页块地址。
注:
算法改进空间:
第一页重置标志位操作被注释后,依然可以编译运行。
(3)default_free_pages:
用于释放已经使用完的页,使其合并到free_list中;
(1)在free_list中查找合适位置,用以插入;
(2)改变被释放页的标志位flags及计数器ref;
(3)在free_list中向高地址或第地址合并。
练习2:
实现寻找虚拟地址对应的页表项(需要编程)
通过设置页表和对应的页表项,可建立虚拟内存地址和物理内存地址的对应关系。
其中的get_pte函数是设置页表项环节中的一个重要步骤。
此函数找到一个虚地址对应的二级页表项的内核虚地址,如果此二级页表项不存在,则分配一个包含此项的二级页表。
本练习需要补全get_pte函数inkern/mm/pmm.c,实现其功能。
请回答如下问题:
请描述页目录项(PagDirectorEntry)和页表(PageTableEntry)中每个组成部分的含义和以及对ucore而言的潜在用处。
如果ucore执行过程中访问内存,出现了页访问异常,请问硬件要做哪些事情?
解答:
分析思路:
pde_t为pagedirectoryentry,也就是一级页表的表项。
pte_t为pagetableentry,表示二级页表的表项。
uintptr_t表示为线性地址,由于段式管理只做直接映射,所以它也是逻辑地址。
pgdir(一级页表)给出页表起始地址。
通过查找这个页表,我们需要给出二级页表中对应项的地址。
虽然目前我们只有boot_pgdir一个页表,但是引入进程的概念之后每个进程都会有自己的页表。
有可能根本就没有对应的二级页表的情况,所以二级页表不必要一开始就分配,而是等到需要的时候再添加对应的二级页表。
如果在查找二级页表项时,发现对应的二级页表不存在,则需要根据create参数的值来处理是否创建新的二级页表。
如果create参数为0,则get_pte返回NULL;
如果create参数不为0,则get_pte需要申请一个新的物理页(通过alloc_page来实现,可在mm/pmm.h中找到它的定义),再在一级页表中添加页目录项指向表示二级页表的新物理页。
注,新申请的页必须全部设定为零,因为这个页所代表的虚拟地址都没有被映射。
当建立从一级页表到二级页表的映射时,需要注意设置控制位。
这里应该设置同时设置上PTE_U、PTE_W和PTE_P(定义在mm/mmu.h):
PTE_U:
表示用户态的软件可以读取对应地址的物理内存页内容;
PTE_W:
表示物理内存页内容可写;
PTE_P:
表示物理内存页存在如果原来就有二级页表,或者新建立了页表,则只需返回对应项的地址即可。
(1)尝试获取页表起始地址;
(2)若不成功则直接返回NULL,若成功则申请一个物理页;
(3)获得物理页的线性地址,在一级页表中添加页目录项指向表示二级页表的新物理页;
(4)返回页表地址。
问题解答:
(1)请描述页目录项(PagDirectorEntry)和页表(PageTableEntry)中每个组成部分的含义和以及对ucore而言的潜在用处。
答:
高20位表示下一级页表(或物理页表)的基址(4K对齐),后12位为标志位,分别为
从低位起第0~6位为ucore内核占用,表示指向的下一级页面的某些特性(是否存在、是否可写……);
对于PDE,第7位表示如果pde的PTE_PS位为1,那么pde中所存的就不是下一级页表,而是一张4M页的起始地址;
对于PTE,第7、8位强制位0;
第9~11位供内核以外的软件使用。
(2)如果ucore执行过程中访问内存,出现了页访问异常,请问硬件要做哪些事情?
出现页访问异常会触发缺页中断,缺页中断发生时的事件顺序如下:
1)硬件陷入内核,在内核堆栈中保存程序计数器。
大多数机器将当前指令的各种状态信息保存在特殊的CPU寄存器中。
2)启动一个汇编代码例程保存通用寄存器和其他易失的信息,以免被操作系统破坏。
3)当操作系统发现一个缺页中断时,尝试发现需要哪个虚拟页面。
通常一个硬件寄存器包含了这一信息,如果没有的话,操作系统必须检索程序计数器,取出这条指令,用软件分析这条指令,看看它在缺页中断时正在做什么。
4)一旦知道了发生缺页中断的虚拟地址,操作系统检查这个地址是否有效,并检查存取与保护是否一致。
如果不一致,向进程发出一个信号或杀掉该进程。
如果地址有效且没有保护错误发生,系统则检查是否有空闲页框。
如果没有空闲页框,执行页面置换算法寻找一个页面来淘汰。
5)如果选择的页框“脏”了,安排该页写回磁盘,并发生一次上下文切换,挂起产生缺页中断的进程,让其他进程运行直至磁盘传输结束。
无论如何,该页框被标记为忙,以免因为其他原因而被其他进程占用。
6)一旦页框“干净”后(无论是立刻还是在写回磁盘后),操作系统查找所需页面在磁盘上的地址,通过磁盘操作将其装入。
该页面被装入后,产生缺页中断的进程仍然被挂起,并且如果有其他可运行的用户进程,则选择另一个用户进程运行。
7)当磁盘中断发生时,表明该页已经被装入,页表已经更新可以反映它的位置,页框也被标记为正常状态。
8)恢复发生缺页中断指令以前的状态,程序计数器重新指向这条指令。
9)调度引发缺页中断的进程,操作系统返回调用它的汇编语言。
10)该例程恢复寄存器和其他状态信息。
练习3:
释放某虚地址所在的页并取消对应二级页表项的映射(需要编程)
当释放一个包含某虚地址的物理内存页时,需要让对应此物理内存页的管理数据结构Page做相关的清除处理,使得此物理内存页成为空闲;
另外还需把表示虚地址与物理地址对应关系的二级页表项清除。
请仔细查看和理解page_remove_pte函数中的注释。
为此,需要补全在kern/mm/pmm.c中的page_remove_pte函数。
数据结构Page的全局变量(其实是一个数组)的每一项与页表中的页目录项和页表项有无对应关系?
如果有,其对应关系是啥?
如果希望虚拟地址与物理地址相等,则需要如何修改lab2,完成此事?
使用pte2page宏即可得到从页表项得到对应的物理页面所对应的Page结构体。
得到结构体后,判断此页被引用的次数,如果仅仅被引用一次,对页面引用进行更改,降为零则这个页可以被释放。
否则,只能释放页表入口。
(1)在页表存在情况下,利用pte2page得到从页表项得到对应的物理页面所对应的Page结构体;
(2)判断此页被引用的次数;
(3)如果仅仅被引用一次,对页面引用进行更改,降为零则这个页可以被释放;
(4)否则,释放页表入口,清除二级页表项。
(1)数据结构Page的全局变量(其实是一个数组)的每一项与页表中的页目录项和页表项有无对应关系?
Page结构体与物理页一一对应,pte2page函数从页表项找到对应物理页的Page结构体:
即Page结构体和对应物理页的起始地址一一对应。
(2)如果希望虚拟地址与物理地址相等,则需要如何修改lab2,完成此事?
通过ld工具形成的ucore的起始虚拟地址从0xC0100000开始,而bootloader把ucore放在了起始物理地址为0x100000的物理内存空间。
要使得虚拟地址与物理地址相等:
首先更改KERNBASE,从0xC000000到0x00000000,原因在于在没有开启页式地址转换前,内核逻辑地址经过一次段地址转换即直接得到物理地址:
PA(物理地址)=LA(线性地址)=VA(逻辑地址)-KERNBASE;
其次,虚拟地址由0xC0100000改成0x00100000。
运行结果
四、实验体会
本实验是关于物理内存管理,主要从物理内存和建立页表两个方面设计实验,首先了解如何发现系统中的物理内存,然后了解如何建立对物理内存的初步管理,最后了解页表相关的操作总体来说还是有难度,尤其后面需要编程的内容需要很好理解各个文件的代码,参考答案进行分析,才能更好的理解实验内涵,通过实验也能深入理解段页式内存管理机制,对上课的内容有了更深理解体会。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 lab2 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)