2024年ucore实验3实验报告_第1页
2024年ucore实验3实验报告_第2页
2024年ucore实验3实验报告_第3页
2024年ucore实验3实验报告_第4页
2024年ucore实验3实验报告_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

LAB3试验汇报试验目的:理解虚拟内存的PageFault异常处理实現理解页替代算法在操作系统中的实現试验内容:本次试验是在试验二的基础上,借助于页表机制和试验一中波及的中断异常处理机制,完毕Page Fault异常处理和FIFO页替代算法的实現,結合磁盘提供的缓存空间,從而可以支持虚存管理,提供一种比实际物理内存空间“更大”的虚拟内存空间給系统使用。這個试验与实际操作系统中的实現比较起来要简朴,不過需要理解试验一和试验二的详细实現。实际操作系统系统中的虚拟内存管理设计与实現是相称复杂的,波及到与進程管理系统、文献系统等的交叉访問。假如大家有余力,可以尝试完毕扩展练习,实現extendedclock页替代算法。练习练习0:填写已經有试验本试验依赖试验1/2。請把你做的试验1/2的代码填入本试验中代码中有“LAB1”,“LAB2”的注释對应部分。练习1:給未被映射的地址映射上物理页完毕do_pgfault(mm/vmm.c)函数,給未被映射的地址映射上物理页。设置访問权限 的時候需要参照页面所在VMA的权限,同步需要注意映射物理页時需要操作内存控制 构造所指定的页表,而不是内核的页表。注意:在LAB2 EXERCISE 1处填写代码。执行makeqemu後,假如通過check_pgfault函数的测试後,會有“check_pgfault()succeeded!”的输出,表达练习1基本對的。請在试验汇报中简要阐明你的设计实現過程。請回答如下問題:請描述页目录项(Pag Director Entry)和页表(Page Table Entry)中构成部分對ucore实現页替代算法的潜在用处。假如ucore的缺页服务例程在执行過程中访問内存,出現了页访問异常,請問硬件要做哪些事情?問題分析:當启動分页机制後来,假如一条指令或数据的虚拟地址所對应的物理页不在内存中,或者访問权限不够,那么就會产生页錯误异常。其详细原因有如下三點:页表项全為0——虚拟地址与物理地址為建立映射关系或已被撤销。物理页面不在内存中——需要進行换页机制。访問权限不够——应當报錯。根据以上三點錯误原因,完毕页錯误处理函数do——pgfault()。大体思绪:do_pgfault()函数從CR2寄存器中获取页錯误异常的虚拟地址,根据errorcode来查找這個虚拟地址与否在某一种VMA的地址范围内,并且具有對的的权限。假如满足上述两個规定,则需要為分派一种物理页。程序代码:Kern/mm/vmm.c中do_pgfault()函数的EXERCISE1修改如下://尝试找到pte,假如對应的页表项PT不存在则创立一种//這裏调用函数get_pte(pde_t*pgdir,uintptr_tla,boolcreate),其中create=1表达若PT不存在则容許创立if((ptep=get_pte(mm->pgdir,addr,1))==NULL){//尝试查找页表入口cprintf("get_pteindo_pgfaultfailed\n");//假如找不到入口,是非法访問,退出gotofailed;}//假如物理地址不存在,则建立一种逻辑地址和物理地址的映射//perm為VMA的权限if(*ptep==0){//尝试申請一种页,假如申請失败就是内存局限性了,退出if(pgdir_alloc_page(mm->pgdir,addr,perm)==NULL){cprintf("pgdir_alloc_pageindo_pgfaultfailed\n");gotofailed;}}思索題:1.請描述页目录项(PageDirectorEntry)和页表(PageTableEntry)中构成部分對ucore实現页替代算法的潜在用处。Ans. 页目录项(pgdir)作為一种双向链表存储了目前所有的页的物理地址和逻辑地址的對应,即在实内存中的所有页,替代算法中被换出的页從pgdir中选出。页表(pte)则存储了替代算法中被换入的页的信息,替代後會将其映射到一物理地址。2.假如ucore的缺页服务例程在执行過程中访問内存,出現了页访問异常,請問硬件要做哪些事情?Ans. 产生页访問异常後,CPU把引起页访問异常的线性地址装到寄存器CR2中,并給出了出錯码errorCode,阐明了页访問异常的类型。ucoreOS會把這個值保留在structtrapframe中tf_err组员变量中。而中断服务例程會调用页访問异常处理函数do_pgfault進行详细处理。练习2:补充完毕基于FIFO的页面替代算法(需要编程)完毕vmm.c中的do_pgfault函数,并且在实現FIFO算法的swap_fifo.c中完毕map_swappable和swap_out_vistim函数。通過對swap的测试。注意:在LAB2 EXERCISE 2处填写代码。执行makeqemu後,假如通過check_swap函数的测试後,會有“check_swap() succeeded!”的输出,表达练习2基本對的。請在试验汇报中简要阐明你的设计实現過程。請在试验汇报中回答如下問題:假如要在ucore上实現"extended clock页替代算法"請給你的设计方案,既有的swap_manager框架与否足以支持在ucore中实現此算法?假如是,請給你的设计方案。假如不是,請給出你的新的扩展和基此扩展的设计方案。并需要回答如下問題需要被换出的页的特性是什么?在ucore中怎样判断具有這样特性的页?何時進行换入和换出操作?問題分析:根据练习1,當页錯误异常发生時,有也許是由于页面保留在swap区或者磁盘文献上导致的,练习2需要运用页面替代算法处理這個問題。大体思绪:页面替代重要分為两個方面,页面换出和页面换入。页面换入重要在vmm.c中的do_pgfault()函数实現:页面换出重要在swap_fifo.c中的swap_out_vistim()函数实現。在换入時,需要先检查产生访問异常的地址与否属于某個vma表达的合法虚拟地址,并且保留在硬盘的swap文献中(對应的PTE的高24位不為0)。假如满足以上两點,则执行swap_in()函数换入页面。换出则相對简朴,當申請空闲页面時,alloc_pages()函数不能获得空闲页,则需要调用swap_out()函数函数换出不常用的页面。程序代码:Kern/mm/vmm.c中do_pgfault()函数的EXERCISE2修改如下:else{//假如pte是需要互换的表项,那么就從硬盘的物理地址将数据讀到页中//然後调用page_insert()建立物理地址和逻辑地址映射if(swap_init_ok){structPage*page=NULL; //根据mm构造和addr地址,尝试将硬盘中的内容换入至page中//此時的page還没有加入到队列中if((ret=swap_in(mm,addr,&page))!=0){//ret=0表达swap_in()正常运行結束cprintf("swap_inindo_pgfaultfailed\n");gotofailed;}//建立虚拟地址合物理地址之间的對应关系page_insert(mm->pgdir,page,addr,perm);//将此页面设置成可互换的swap_map_swappable(mm,addr,page,1);}else{cprintf("noswap_init_okbutptepis%x,failed\n",*ptep);gotofailed;}Kern/mm/swap_fifo.c中的EXERCISE2修改如下:_fifo_map_swappable(structmm_struct*mm,uintptr_taddr,structPage*page,intswap_in){//将近来被用到的页面添加到算法所维护的次序队列 //找到pra_list_head队列list_entry_t*head=(list_entry_t*)mm->sm_priv;//找到被换入的页表项list_entry_t*entry=&(>pra_page_link);assert(entry!=NULL&&head!=NULL);/*LAB3EXERCISE2:YOURCODE*///将近来分派的页插入到pra_list_head队列的尾部. list_add_before(head,entry);return0;}_fifo_swap_out_victim(structmm_struct*mm,structPage**ptr_page,intin_tick){//查询哪個页面需要被换出 //找到pra_list_head队列list_entry_t*head=(list_entry_t*)mm->sm_priv;assert(head!=NULL);assert(in_tick==0);//选择应當被换出的页表,即FIFO中最早调入的页表 list_entry_t*le=head->next; assert(le!=head);/*LAB3EXERCISE2:YOURCODE*///将换出的页表從pra_list_head队列中删除 structPage*p=le2page(le,pra_page_link); list_del(le); assert(p!=NULL);//将页的地址的地址赋值給ptr_page *ptr_page=p;return0;}思索題:假如要在ucore上实現"extendedclock页替代算法"請給你的设计方案,既有的swap_manager框架与否足以支持在ucore中实現此算法?假如是,請給你的设计方案。假如不是,請給出你的新的扩展和基此扩展的设计方案。答:目前的swap_manager框架足以支持在ucore中实現extendedclock算法。在kern/mm/mmu.h文献中有如下定义:#definePTE_A0x020//Accesseed因此(*ptep&PTE_A)即可以表明该页与否被访問過,由此实現extendedclock。于是對kern/mm/vmm.h做對应的修改:_fifo_swap_out_victim(structmm_struct*mm,structPage**ptr_page,intin_tick){ list_entry_t*head=(list_entry_t*)mm->sm_priv; assert(head!=NULL); assert(in_tick==0); list_entry_t*le=head->next; assert(head!=le); while(le!=head){ structPage*p=le2page(le,pra_page_link); pte_t*ptep=get_pte(mm->pgdir,p->pra_vaddr,0); if(!(*ptep&PTE_A)){ //未被访問 list_del(le); assert(p!=NULL); *ptr_page=p; return0; } *ptep^=PTE_A; le=le->next; } le=le->next; while(le!=head){ structPage*p=le2page(le,pra_page_link); pte_t*ptep=get_pte(mm->pgdir,p->pra_vaddr,0); list_del(le); assert(p!=NULL); *ptr_page=p; return0; }}需要被换出的页的特性是什么?答:在FIFO中,需要被换出的页是目前所有页中最早被调入的那一页。在ucore中怎样判断具有這样特性的页?答:需要被换出的页位于pra_list_head队列的前端,即mm->sm_priv->next指示的那一页。何時進行换入和换出操作?答:當需要调用的页不在页表中時,并且在页表已满的状况下,需要進行换入和换出操作。扩展练习Challenge:实現识别dirtybit的extended clock页替代算法(需要编程)問題分析:算法根据页面近期与否被修改從而决定该页面与否应當被换出。因此在查询空闲页時,需要加上對dirtybit的判断。大体思绪:當操作系统需要淘汰页時,對目前指针指向的页所對应的页表项進行查询,假如dirtybit為0,则把此页换出到硬盘上;假如dirtybit為1,则将dirtybit置為0,继续访問下一种页。程序代码:相比较FIFO的操作,dirtybit的替代算法只需要识别出哪些页被访問過,以及哪些页被修改正即可。在kern/mm/mmu.h文献下有如下的定义:#definePTE_A0x020//Accessed#definePTE_D0x040//Dirty其中PTE_A和PTE_D分别是表达访問和修改的標识位,因此与*ptep求与即可判断页与否被访問或修改正。首先根据基础的extendedclock算法,未被访問的页应优先考虑换出;在此基础上,由于被修改的也需要被写會硬盘,因此未被修改的页应當有限换出。因此采用多轮循环。只需要修改kern/mm/vmm.h中的_fifo_swap_out_victim()函数即可实現:_fifo_swap_out_victim(structmm_struct*mm,structPage**ptr_page,intin_tick){ list_entry_t*head=(list_entry_t*)mm->sm_priv; assert(head!=NULL); assert(in_tick==0);//将head指针指向最先進入的页面 list_entry_t*le=head->next; assert(head!=le); //查找最先進入并且未被修改的页面 while(le!=head){ structPage*p=le2page(le,pra_page_link);//获取页表项 pte_t*ptep=get_pte(mm->pgdir,p->pra_vaddr,0); //判断获得的页表项与否對的 if(!(*ptep&PTE_A)&&!(*ptep&PTE_D)){ //未被访問,未被修改 //假如dirtybit為0,换出//将页面從队列中删除list_del(le); assert(p!=NULL);//将這一页的地址存储在prt_page中 *ptr_page=p; return0; } le=le->next; } le=le->next; while(le!=head){ structPage*p=le2page(le,pra_page_link); pte_t*ptep=get_pte(mm->pgdir,p->pra_vaddr,0); if(!(*ptep&PTE_A)&&(*ptep&PTE_D)){ //未被访問,已被修改 list_del(le); assert(p!=NULL); *ptr_page=p; return0; } *ptep^=PTE_A; //页被访問過则将PTE_A位置0 le=le->next; } le=le->next; while(le!=head){ structPage*p=le2page(le,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论