ucore操作系统Lab3虚拟内存管理试验报告(含challenge).docxVIP

ucore操作系统Lab3虚拟内存管理试验报告(含challenge).docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ucore操作系统Lab3虚拟内存管理试验报告(含challenge)

Lab3试验报告练习1:给未被映射的地址映射上物理页问题分析:当启动分页机制以后,如果一条指令或数据的虚拟地址所对应的物理页不在内存中,或者访问权限不够,那么就会产生页错误异常。其具体原因有以下三点:页表项全为0——虚拟地址与物理地址未建立映射关系或已被撤销。物理页面不在内存中——需要进行换页机制。访问权限不够——应当报错。根据以上三点错误原因,完成页错误处理函数do_pgfault()。大体思路:do_pgfault()函数从CR2寄存器中获取页错误异常的虚拟地址,根据error code来查找这个虚拟地址是否在某一个VMA的地址范围内,并且具有正确的权限。如果满足上述两个要求,则需要为分配一个物理页。关键代码://尝试获得页表入口 if ((ptep = get_pte(mm-pgdir, addr, 1)) == NULL) { //如果找不到入口,是非法访问,退出 cprintf(get_pte in do_pgfault failed\n); goto failed; } //页表不存在,页表项全为0 if (*ptep == 0) { //尝试申请一个页,如果申请失败,就是内存不足了,退出 if (pgdir_alloc_page(mm-pgdir, addr, perm) == NULL) { cprintf(pgdir_alloc_page in do_pgfault failed\n); goto failed; }}练习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) { struct Page *page=NULL; //根据mm结构和addr地址,尝试将硬盘中的内容换入至page中 //此时的page还没有加入到队列中 if ((ret = swap_in(mm, addr, page)) != 0) { cprintf(swap_in in do_pgfault failed\n); goto failed; } //建立虚拟地址和物理地址之间的对应关系 page_insert(mm-pgdir, page, addr, perm); //将此页面设置为可交换的 swap_map_swappable(mm, addr, page, 1); } else { cprintf(no swap_init_ok but ptep is %x, failed\n,*ptep); goto failed; } }页面换出的关键代码FIFO替换算法会维护一个队列,队列按照页面调用的次序排列,越早被加载到内存的页面会越早被换出。下面几个关键函数在swap_out()中被调用。_fifo_swap_out_victim()函数是用来查询哪个页面需要被换出。static int_fifo_swap_out_victim(struct mm_struct *mm, struct Page ** ptr_page, int in_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); struct Page *p = le2page(le, pra_page_link); //将进来最早的页面从队列中删除 list_del(le); assert(p !=NULL); //将这一页的地址存储在ptr_page中 *ptr_page = p; return 0;}_fifo_map_swappable()函数将最近被用到的页面添加到算法所维护的次序队列static int_fifo_map_swappable(struct mm_str

文档评论(0)

haihang2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档