ucore操作系统Lab3虚拟内存管理试验报告(含challenge)_第1页
ucore操作系统Lab3虚拟内存管理试验报告(含challenge)_第2页
ucore操作系统Lab3虚拟内存管理试验报告(含challenge)_第3页
ucore操作系统Lab3虚拟内存管理试验报告(含challenge)_第4页
ucore操作系统Lab3虚拟内存管理试验报告(含challenge)_第5页
已阅读5页,还剩1页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

Lab3试验报告练习1:给未被映射的地址映射上物理页问题分析:当启动分页机制以后,如果一条指令或数据的虚拟地址所对应的物理页不在内存中,或者访问权限不够,那么就会产生页错误异常。其具体原因有以下三点:页表项全为0——虚拟地址与物理地址未建立映射关系或已被撤销。物理页面不在内存中——需要进行换页机制。访问权限不够——应当报错。根据以上三点错误原因,完成页错误处理函数do_pgfault()。大体思路:do_pgfault()函数从CR2寄存器中获取页错误异常的虚拟地址,根据errorcode来查找这个虚拟地址是否在某一个VMA的地址范围内,并且具有正确的权限。如果满足上述两个要求,则需要为分配一个物理页。关键代码://尝试获得页表入口if((ptep=get_pte(mm->pgdir,addr,1))==NULL){ //如果找不到入口,是非法访问,退出cprintf("get_pteindo_pgfaultfailed\n");gotofailed;}//页表不存在,页表项全为0if(*ptep==0){ //尝试申请一个页,如果申请失败,就是内存不足了,退出if(pgdir_alloc_page(mm->pgdir,addr,perm)==NULL){cprintf("pgdir_alloc_pageindo_pgfaultfailed\n");gotofailed;}}练习2:补充完成基于FIFO()的页面替换算法。问题分析: 根据练习1,当页错误异常发生时,有可能是因为页面保存在swap区或者磁盘文件上造成的,练习2需要利用页面替换算法解决这个问题。大体思路: 页面替换主要分为两个方面,页面换出和页面换入。 页面换入主要在vmm.c中的do_pgfault()函数实现;页面换出主要在swap_fifo.c中的swap_out_vistim()函数实现。 在换入时,需要先检查产生访问异常的地址是否属于某个vma表示的合法虚拟地址,并且保存在硬盘的swap文件中(对应的PTE的高24位不为0)。如果满足以上亮点,则执行swap_in()函数换入页面。 换出则相对简单,当申请空闲页面时,alloc_pages()函数不能获得空闲页,则需要调用swap_out()函数换出不常用的页面。关键代码:页面换入的关键代码//页表项非空,可以尝试换入页面else{if(swap_init_ok){structPage*page=NULL;//根据mm结构和addr地址,尝试将硬盘中的内容换入至page中//此时的page还没有加入到队列中if((ret=swap_in(mm,addr,&page))!=0){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;}}页面换出的关键代码FIFO替换算法会维护一个队列,队列按照页面调用的次序排列,越早被加载到内存的页面会越早被换出。下面几个关键函数在swap_out()中被调用。_fifo_swap_out_victim()函数是用来查询哪个页面需要被换出。staticint_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->prev;assert(head!=le);structPage*p=le2page(le,pra_page_link);//将进来最早的页面从队列中删除list_del(le);assert(p!=NULL);//将这一页的地址存储在ptr_page中*ptr_page=p;return0;}_fifo_map_swappable()函数将最近被用到的页面添加到算法所维护的次序队列staticint_fifo_map_swappable(structmm_struct*mm,uintptr_taddr,structPage*page,intswap_in){list_entry_t*head=(list_entry_t*)mm->sm_priv;list_entry_t*entry=&(>pra_page_link);assert(entry!=NULL&&head!=NULL);list_add(head,entry);return0;}Challenge:实现识别dirtybit的extendedclock页替换算法问题分析: 算法根据页面近期是否被修改从而决定该页面是否应当被换出。所以在查询空闲页时,需要加上对dirtybit的判断。大体思路: 当操作系统需要淘汰页时,对当前指针指向的页所对应的页表项进行查询,如果dirtybit为0,则把此页换出到硬盘上;如果dirtybit为1,则将dirtybit置为0,继续访问下一个页。大致步骤:根据mmu.h中定义的属性位,查找到dirtybit所对应的位置:#definePTE_D0x040//Dirty根据新的替换算法思想编写函数_extended_clock()。最后需要更改默认替换算法。关键代码:staticint_extended_clock_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->prev;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<0x1000) break; //判断dirtybit if(!(*ptep&PTE_D)) { //如果dirtybit为0,换出 //将页面从队列中删除 list_del(le); assert(p!=NULL); //将这一页的地址存储在ptr_page中 *ptr_page=p; return0; } else { //如果为1,赋值为0,并跳过 *ptep&=0xffffffbf; } le=le->prev;}//如果执行到这里证明找完了一圈,所有页面都不符合换出条件//那么强行换出最先进入的页面le=head->pr

温馨提示

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

最新文档

评论

0/150

提交评论