2023年操作系统lab2实验报告_第1页
2023年操作系统lab2实验报告_第2页
2023年操作系统lab2实验报告_第3页
2023年操作系统lab2实验报告_第4页
2023年操作系统lab2实验报告_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

湖泊大掌HunanUNIVERSITY操作系统实验报告400//设置页目录项内容401*pdep=pa|PTEU|PTE_W|PTEP;402)403//返回页表地址404return&{(pte_t*)KADDR(PDE_ADDR(*pdep)))(PTX(la)];405)问题解答:(1)请描述页目录项(PagDirectorEntry)和页表(PageTab1eEntry)中每个组成部分的含义和以及对ucore而言的潜在用处。答:高2()位表达下一级页表(或物理页表)的基址(4K对齐),后12位为标志位,分别为从低位起第0~6位为ucore内核占用,表达指向的下一级页面的某些特性(是否存在、是否可写……);/*pagetable/directoryentryflags*/#definePTE_P0X001//PresentsdefinePTE_W0x002//Writeable#definePTE_U0x004//User/definePTE_PVrr0x008//Write-ThroughsdefinePTE_PCD0x010//Cache-Disable二definePTE_A0x020//Accessed^definePTE_D0x040//Dirty#definePTE_PS0x080//PageSize#definePTEJ1BZ0x180//BitsmustbezeroadefinePTE_AVAIL0xE00//Availableforsoftwareuse//ThePTE_AVAILbitsaren'tusedbythekernelor,interpretedbythe//hardware,souserprocessesareallowedtosetthemarbitrarily.对于PDE,第7位表达假如pde的PTE_PS位为1,那么pde中所存的就不是下一级页表,而是一张4M页的起始地址;对于PTE,第7、8位强制位();第9位供内核以外的软件使用。(2)假如ucore执行过程中访问内存,出现了页访问异常,请问硬件要做哪些事情?答:出现页访问异常会触发缺页中断,缺页中断发生时的事件顺序如下:1)硬件陷入内核,在内核堆栈中保存程序计数器。大多数机器将当前指令的各种状态信息保存在特殊的CPU寄存器中。2)启动一个汇编代码例程保存通用寄存器和其他易失的信息,以免被操作系统破坏。3)当操作系统发现一个缺页中断时,尝试发现需要哪个虚拟页面。通常一个硬件寄存器包含了这一信息,假如没有的话,操作系统必须检索程序计数器,取出这条指令,用软件分析这条指令,看看它在缺页中断时正在做什么。4)一旦知道了发生缺页中断的虚拟地址,操作系统检查这个地址是否有效,并检杳存取与保护是否一致。假如不一致,向进程发出一个信号或杀掉该进程。假如地址有效且没有保护错误发生,系统则检查是否有空闲页框。假如没有空闲页框,执行页面置换算法寻找一个页面来淘汰。5)假如选择的页框"脏''了,安排该页写回磁盘,并发生一次上下文切换,挂起产生缺页中断的进程,让其他进程运营直至磁盘传输结束。无论如何,该页框被标记为忙,以免由于其他因素而被其他进程占用。6)一旦页框“干净”后(无论是立刻还是在写回磁盘后),操作系统查找所需页面在磁盘上的地址,通过磁盘操作将其装入。该页面被装入后,产生缺页中断的进程仍然被挂起,并且假如有其他可运营的用户进程,则选择另一个用户进程运营。7)当磁盘中断发生时,表白该页已经被装入,虫表已经更新可以反映它的位置,虫框也被标记为正常状态。8)恢复发生缺页中断指令以前的状态,程序计数器重新指向这条指令。9)调度引发缺页中断的进程,操作系统返回调用它的汇编语言。10)该例程恢复寄存器和其他状态信息。练习3:释放某虚地址所在的页并取消相应二级页表项的映射(需要编程)当释放一个包含某虚地址的物理内存页时,需要让相应此物理内存页的管理数据结构Page做相关的清除解决,使得此物理内存页成为空闲;此外还需把表达虚地址与物理地址相应关系的二级页表项清除。请仔细查看和理解page_removepte函数中的注释。为此,需要补全在kern/mm/pmm.c•PKpageremove_pte函数。请回答如下问题:数据结构Page的全局变量(其实是一个数组)的每一项与页表中的页目录项和页表项有无相应关系?假如有,其相应关系是啥?假如希望虚拟地址与物理地址相等,则需要如何修改lab2,完毕此事?解答:分析思绪:使用pte2page宏即可得到从页表项得到相应的物理页面所相应的Page结构体。得到结构体后,判断此页被引用的次数,假如仅仅被引用一次,对页面引用进行更改,降为零则这个页可以被释放。否则,只能释

放页表入口。代码分析:A.环节:(1)在页表存在情况卜;运用Pte2page得到从页表项得到相应的物理页面所相应的Page结构体;(2)判断此页被引用的次数;(3)假如仅仅被引用一次,对页面引用进行更改,降为零则这个页可以被释放:(4)否则,释放页表入口,清除二级页表项。B.具体实现:423//参数是一级页表的起始地址,线性地址,二级页表对应的物理页424staticinlinevoid425pageremovepte(pdet*pgdir,uintptrtla,ptet*ptep){451451452453454455456457458459460461462463)451452453454455451452453454455456457458459460461462463)〃从页表项得到对应的物理页所对应的Page结构体structPage*page=pte2page(*ptep);//判断此页是否多次被引用if(pagerefdec(page)==0){freepage(page);}*ptep=0;//使得TLB无效,清除二级页表项tlbinvalidate(pgdir,la);)问题解答:(1)数据结构Page的全局变量(其实是一个数组)的每一项与页表中的页目录项和页表项有无相应关系?假如有,其相应关系是啥?答:Page结构体与物理页••相应,pte2page函数从页表项找到相应物理页的Page结构体:105staticinlinestructPage*106pte2page(ptetpte){107if(!(pte&PTE_P)){108panic("pte2pagecalledwithinvalidpte");109}110returnpa2page(PTEADDR(pte));111)即Page结构体和相应物理页的起始地址相应。⑵假如希望虚拟地址与物理地址相等,则需要如何修改lab2,完毕此事?答:通过1d工具形成的ucore的起始虚拟地址从0xC0100000开始,而boolloader把ucore放在了起始物理地址为0x100000的物理内存空间。要使得虚拟地址与物理地址相等:一方面更改KERNBASE,从0x0)00000到0x00000000,因素在于在没有启动页式地址转换前,内核逻辑地址通过一次段地址转换即直接得到物理地址:PA(物理地址)=LA(线性地址)=VA(逻辑地址)一KERNBASE;另一方面,虚拟地址由OxCOlOOOOO改成0x00100000o运营结果©B©QEMUkern/init/init.c:58:grade_backtrace0*23cbp:0xc0116fc8eip:0XC0100128args:OxcO105efc0xc0105ee00xO0000f3Z0x00000000kern/init/init.c:63:grade_backtrace*34ebp:0xcO116ff8eip:0xcOlOO07fargs:0x000000000x00000000OxOOOOffff0x40cf9aO0kern/init/init.c:Z8:kern_init*84memorymanagement:defau1t_pmm_managercBZOmap:memory:00O9fc00,[00000000,0009fbff],type=1.memory:00000400,[0009fc00,0009ffff],type=z.memory:00010000,[00Of0000,OOOfffff],typez.memory:07efe0OO,[00100000,07ffdfff],type=1.memory:00O0Z0OO,[0?ffe000,07ffffff],type=z.memory:00040000,[fffc00O0,ffffffff],type=z.check_a1loc_page()succeeded!check_pgdir()succeeded!check_boot_pgdir()succeeded!kBEGINPDE(0e0)c0000000-f800000038000000urwi—PTE(38000)c0000000-f800000038000000-rwPDE(001)fac00O00-fb00000000400000-rwi—PTE(000e0)faf00000-fafe000O00060000urwPTE(00001)fafebOOO-fafecOOO00001000-rwEND++setuptimerinterrupts四、实验体会本实验是关于物理内存管理,重要从物理内存和建立页表两个方面设计实验,一方面了解如何发现系统中的物理内存,然后了解如何建立对物理内存的初步管理,最后了解页表相关的操作总体来说还是有难度,特别后面需要编程的内容需要很好理解各个文献的代码,参考答案进行分析,才干更好的理解实验内涵,通过实验也能进一步理解段页式内存管理机制,对上课的内容有了更深理解体会。目录一、内容。错误!未定义书签。二、目的。错误!未定义书签。三、实验设计思想和练习题。错误!未定义书签。练习0:填写已有实验错误!未定义书签。练习1:实现first-fit连续物理内存分派算法(需要编程).错误!未定义书签。练习2:实现寻找虚拟地址相应的页表项(需要编程)。错误!未定义书签。练习3:释放某虚地址所在的页并取消相应二级页表项的映射(需要编程)错误!未定义书签。运营结果错误!未定义书签。四、实验体会错误!未定义书签。一、内容本次实验包含三个部分。一方面了解如何发现系统中的物理内存;然后了解如何建立对物理内存的初步管理,即了解连续物理内存管理;最后了解页表相关的操作,即如何建立页表来实现虚拟内存到物理内存之间的映射,对段页式内存管理机制有一个比较全面的了解。二、目的.理解基于段页式内存地址的转换机制;.理解页表的建立和使用方法;.理解物理内存的管理方法。三、实验设计思想和练习题练习0:填写已有实验使用eclipse中的diff/merge工具将实验1的代码填入本实验中代码中有“LAB1”的注释相应部分。练习L实现first-fit连续物理内存分派算法(需要编程)在实现firstfit内存分派算法的回收函数时,要考虑地址连续的空闲块之间的合并操作。提醒:在建立空闲页块链表时,需要按照空闲页块起始地址来排序,形成一个有序的链表。也许会修改default.pmm.c中的default_init,defau1t_init_memmap,defau1t_a1loc_pages,default_free_pages等相关函数。请仔细查看和理解defaultpmm.c中的注释。请在实验报告中简要说明你的设计实现过程。请归I答如下问题:你的firstfit算法是否有进一步的改善空间。解答:分析思绪:(1)数据结构:

A.每个物理页运川一个Page结构体表达,查看kern/mm/memlayout.h涉及:ref:引用计数,即映射此物理页的虚拟页个数;flags:描述物理页属性,bit0设立为1,即为“被保存”项,bit1设立为1,即为空闲项;property:记录某连续内存块的大小,即地址连续的空闲页的个数;page」ink:将多个连续内存链接在一起的双向链表指针,即构建双向链接各个Page结构的双向链表。[-/moocos/ucorelab/labcodes/lab2/kern/mm]vimmemlayout.hstructPage{intref;intref;uint32_tflags;tusofthepageframeunsignedintproperty;fitpmmanagerlistentrytpagelink;};//arrayofflagsthatdescribethesta//thenumoffreeblock,usedinfirst//freelistlinkB.所有的连续内存空闲块可用一个双向链表管理,运用一个frco_area_t结构体表达,查看korn/mm/memlayout.h涉及:1ist_entry:双向链表指针,指向空闲的物理页;nr_free:记录当前空闲页的个数的无符号整形变量。typedefstruct{listentrytfreelist;//thelistheaderunsignedintnr_free;//#offreepagesinthisfreelist}freeareat;(2)连续物理内存分派思绪:物理内存页管理器顺着双向链表进行搜索空闲内存区域,直到找到一个足够大的空闲区域,这是一种速度不久的算法,由于它尽也许少地搜索链表。假如空闲区域的大小和申请分派的大小正好同样,则把这个空闲区域分派出去,成功返回;否则将该空闲区分为两部分,一部分区域与申请分派的大小相等,把它分派出去,剩下的一部分区域形成新的空闲区。其释放内存的设计思绪是把这块区域重新放回双向链表中。(3)具体设计:kern_init-->pmm_init-->page_init-->init_memmap-->pmm_manager->init_memmap.bootloader进行探测物理格局后,运用kern_entry()函数设立堆栈,并临时建立一个段映射关系,调用kern_init()函数输出检查后,()函数完毕物理内存的管理,假定page_iniI()函数是按照地址从小到大的顺序传递连续内存空闲块,根据page_init()函数中传递的参数(某个连续的空闲块的起始贝,负个数),default,init_memmap()来建立一个连续内存空闲块的双向链表,链表头设free_area.free_list,链表项设Page的base->pagelinko代码分析:(Odefault_initmemmap:用于构建空闲页链表;A.环节:(1)初始化每一个空闲页,注意使用头插法是由于地址是从低到高地址增长;(2)计算空闲页的总数。B.具体实现:.default_pcnm.cx6768〃参数是某个连续的空闲块的起始页,页个数69staticvoiddefault_init_memmap(structPage*base,size_tn){〃保证分配不会超出品阐,Z即报错保证鲁棒性assert(n>0);structPage*p=base;for(;p!=base+n;p++){〃检查此页是否为保留页assert(PageReserved(p));//设置标志位,将PG_reserved置0,初始化内存空闲块大小p->flags=p->property=0;SetPageProperty(p);//清零此页的引用计数setpageref(pr0);//使用头插法将空闲页插入到链表list_add_before|(&freelistr&(p->page_link));)//firstblock//计算空闲页总数base->property=n;nr_free+=n;)(2)default_a11oc_pages:用于为进程分派空闲页;A.环节:。(1)从空闲链表表头开始查找最小的地址,寻找足够大的空闲块;(2)假如找到,获得指向分派的页,重新设立标志位,从空闲徒表中删除此页;(3)判断空闲块大小是否合适;(4)假如合适,不操作;假如不合适,分割页块;(5)计算剩余空闲页个数,返回分派的页块地址。B.具体实现:defaultjxnm.cx90//参数是页的个数staticstructPage*defaultallocpages(size_tn){//保证分配不会超出范围,立即报错保证鲁棒性assert(n>0);if(n>nrfree){returnNULL;}listentryt*le,*len;//从空闲链表”开始查找最小的地址le=&freelist;100101//通过list_next找到下一个空闲块元素102while((le=listnext(le))!=&freelist){103//通过le2page宏根据链表元素获得对应的Page指针p104structPage*p=le2page(le,pagelink);105〃判断空闲块大小,找到合适大小的页块一106if(p->property>=n){107inti;108for(i=0;i<n;i++){109len=listnext(le);110〃让pp指向分配的那一页,le2page宏根据链表元素获得对应Page的指针p111structPage*pp=Le2page(le,pagelink);112//设置每一页的标志位113SetPageReserved(pp);114ClearPageProperty(pp);115//从空闲链表在中删除此页116listdel(le);117le=len;118)119//需要分割的页块进行分割120if(p->property>n){121(Le2pageCle,pagelink))->property=p->property-n;122)123//第一页重置标志位124ClearPageProperty(p);125SetPageReserved(p);126〃计算剩余空闲页个数,返回分配的页块地址127nrfree-=n;128returnp;129}130}131returnNULL;132)注:算法改善空间:第一页重置标志位操作被注释后,仍然可以编译运营。(3)default_frec_pages:用于释放已经使用完的页,使其合并到frec」ist中;A.环节:

(1)在free_list中查找合适位置,用以插入;(2)改变被释放页的标志位flags及计数器ref;(3)在free」ist中向高地址或第地址合并。B.具体实现:134//参数是某个连续的空闲块的起始页,页个数|135staticvoiddefaultfreepages(structPage*base,size_tn){136〃保证分配不会超出范围,金即报错保证鲁棒性137assert(n>0);138assert(PageReserved(base));1390123456789〃查找该插入的位置le0123456789listentryt*le=&freelist;structPage*p;while((le=list_next(le))!=&free_list){p=le2page(le/pagelink);if(p>base){break;))〃向le之前插入n个页,设置标志位150for(p=base;p<base+n;p++){151listaddbefore(lef&(p->pagelink));152base->flags=0;153setpageref(base,0);154ClearPageProperty(base);155SetPageProperty(base);156}157〃将页块大小记录在链表头158base->property=n;159160//向高地址合并161p=le2page(le,pagelink);162if(base+n==p){163base->property+=p->property;164p->property=0;165}678901234666677777678901234666677777111111111le=listprev(&(base->pagelink));p=Le2page(le,pagelink);if(le!=&free_list&&-p==base-l){while(le!=&freelist){if(p->property){p->property+=base->property;base->property=0;break;TOC\o"1-5"\h\z175}176le=listprev(le);177p=Le2page(le,pagelink);178)179}180181nr_free+=n;182return;183)练习2:实现寻找虚拟地址相应的页表项(需要编程)通过设立页表和相应的页表项,可建立虚拟内存地址和物理内存地址的相应关系。其中的get_pte函数是设立页表项环节中的一个重要环节。此函数找到一个虚地址相应的二级页表项的内核虚地址,假如此二级页表项不存在,则分派一个包含此项的二级页表。本练习需要补全get—pt。函数inkern/mm/pmm.c,实现其功能。请回答如卜问题:请描述页目录项(PagDirectorEnIry)和页表(PageTableEntry)中每个组成部分的含义和以及对ucore而言的潜在用处。假如uc。re执行过程中访问内存,出现了页访问异常,请问硬件要做哪些事情?解答:分析思绪:pde_t为pagedirectoryentry,也就是一级页表的表项。Pte_t为pagetableentry,表达二级页表的表项。uintptr_t表达为线性地址,由于段式管理只做直接映射,所以它也是逻辑地址。pgdir(一级页表)给出页表起始地址。通过查找这个页表,我们需要给出

温馨提示

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

评论

0/150

提交评论