操作系统实验七.docx
《操作系统实验七.docx》由会员分享,可在线阅读,更多相关《操作系统实验七.docx(17页珍藏版)》请在三一办公上搜索。
1、操作系统实验七操作系统 实 验 报 告 课程名称 实验项目名称 学号 姓名 学生所在学院 实验室名称地点 操作系统实验 课程编号 0906553 物理存储器与进程逻辑地址空间的管理 年级 专业 指导教师 哈尔滨工程大学 计算机科学与技术学院 实验七 物理存储器与进程逻辑地址空间的管理 一、实验概述 1. 实验名称 物理存储器与进程逻辑地址空间的管理 2. 实验目的 l 通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。 l 通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。 3. 实验类型 验证、设计 4. 实
2、验内容 4.1 准备实验 4.2 阅读控制台命令“pm”相关的源代码,并查看其执行的结果 4.3 分配物理页和释放物理页 4.4阅读控制台命令“vm”相关的源代码,并查看其执行的结果 4.5 在系统进程中分配虚拟页和释放虚拟页 4.6 在应用程序进程中分配虚拟页和释放虚拟页 4.6.1 要求 4.6.2 测试方法 二、实验环境 OS Lab实验环境,EOS操作系统 三、实验过程 1. 设计思路和流程图 MiAllocateAnyPages函数的流程图 MiFreePages函数的流程图 2. 需要解决的问题及解答 在本实验3.3 中,如果分配了物理页后,没有回收,会对 EOS 操作系统造成什么
3、样的影响?目前EOS操作系统内核函数MiAllocateAnyPages 能处理所有物理页被分配完毕的情况吗?例如在没有可分配的物理页的情况下调用该内核函数,是否会返回失败?如果内核函数MiAllocateAnyPages 还不能处理这种极端情况,尝试修改代码解决这个问题。 答:如果分配了物理页后,没有回收,将会使可分配自由页和零页越来越少,最终导致内存溢出,系统无法运行。目前 EOS操作系统内核函数 MiAllocateAnyPages 不能处理所有物理页被分配完毕的情况,在没有可分配的物理页的情况下,不会分配物理页,但仍然会返回成功,添加以下代码即可:Else return STATUS_
4、MEMORY_NOT_ALLOCATED; 在本实验 3.3 中,在分配物理页时是调用的内核函数 MiAllocateAnyPages,该函数会优先分配空闲页,尝试修改代码,调用内核函数MiAllocateZeroedPages优先分配零页,并调试分配零页的情况。尝试从性能的角度分析内核函数MiAllocateAnyPages 和MiAllocateZeroedPages。尝试从安全性的角度分析分配零页的必要性。 答:将MiAllocateAnyPages(1, PfnArray);修改为MiAllocateZeroedPages(1, PfnArray);即可。系统启动时,所有空闲物理页都是
5、未初始化的,此时零页链表为空,MiAllocateAnyPages函数可以直接从自由页链表分配,而MiAllocateZeroedPages函数会对从自由页链表中分配的每一页进行零初始化,确保所有分配页都是被零初始化的,再进行分配,因此MiAllocateZeroedPages函数效率较低。但因为MiAllocateZeroedPages函数对自由页进行了初始化,减小了出错的可能性,从而安全性较高。 按F10单步调试MiAllocateAnyPages函数的执行过程,尝试回答下面的问题: 本次分配的物理页的数量是多少?分配的物理页的页框号是多少? 物理页是从空闲页链表中分配的?还是从零页链表中
6、分配的? 哪一行语句减少了空闲页的数量?哪一行语句将刚刚分配的物理页由空闲状态修改为忙状态? 绘制MiAllocateAnyPages函数的流程图。 答:本次分配的物理页的数量是1,分配的物理页的页框号是0x409;物理页是从空闲页链表中分配的;第226行MiFreePageListHead = MiGetPfnDatabaseEntry(Pfn)-Next;和第227行MiFreePageCount-;减少了空闲页的数量,第229行将刚刚分配的物理页由空闲状态修改为忙状态;见实验过程开头流程图部分。 按 F10单步调试MiFreePages函数的执行过程,尝试回答下面的问题: 本次释放的物理
7、页的数量是多少?释放的物理页的页框号是多少?释放的物理页是之前分配的物理页吗? 释放的物理页是被放入了空闲页链表中?还是零页链表中? 绘制MiFreePages函数的流程图。 答: 本次释放的物理页的数量是1,释放的物理页的页框号0x409,释放的物理页是之前分配的物理页; 释放的物理页被放入了空闲页链表中; 见实验过程开头流程图部分。 按F10单步调试MmAllocateVirtualMemory函数的执行过程,尝试回答下面的问题: 分配的虚拟页的起始地址是多少?分配的虚拟页的数量是多少?它们和参数BaseAddress和RegionSize初始化的值有什么样的关系? 配虚拟页的同时有为虚拟
8、页映射实际的物理页吗?这是由哪个参数决定的? 分配的虚拟页是在系统地址空间还是在用户地址空间?这是由哪个参数决定的? 参考MiReserveAddressRegion函数的定义和注释,说明该函数的功能。 答:分配的虚拟页的起始地址是0xa0003000,分配的虚拟页的数量是1,BaseAddress和 RegionSize初始化的值是期望保留或者提交的地址区域的起始地址和大小;分配虚拟页的同时有为虚拟页映射实际的物理页,这是由第三个参数AllocationType决定的; 分配的虚拟页是在系统地址空间,这是由第四个参数SystemVirtual 决定的;MiReserveAddressRegi
9、on函数的功能是保留一段虚拟地址区域。 按F10单步调试MmFreeVirtualMemory函数的执行过程,尝试回答下面的问题: 本次释放的虚拟地址是多少?释放的虚拟页是之前分配的虚拟页吗? 参考MiFindReservedAddressRegion函数、MiFreeAddressRegion函数和MiDecommitPages函数的定义和注释,说明这些函数的功能。 答:本次释放的虚拟地址是0xa0003000,是之前分配的虚拟页; MiFindReservedAddressRegion函数用于查找已保留地址区域,如果目标区域非已保留区域则返回失败,MiFreeAddressRegion函数
10、用于释放已保留地址区域和MiDecommitPages 函数用于释放映射在连续虚拟页框上的物理页框。 3. 源程序并附上注释 #include EOSApp.h / main 函数参数的意义: / argc - argv 数组的长度,大小至少为 1,argc - 1 为命令行参数的数量。 / argv - 字符串指针数组,数组长度为命令行参数个数 + 1。其中 argv0 固定指向当前 / 进程所执行的可执行文件的路径字符串,argv1 及其后面的指针指向各个命令行 / 参数。 / 例如通过命令行内容 a:hello.exe -a -b 启动进程后,hello.exe 的 main 函 / 数
11、的参数 argc 的值为 3,argv0 指向字符串 a:hello.exe,argv1 指向 / 参数字符串 -a,argv2 指向参数字符串 -b。 / int main(int argc, char* argv) / / 启动调试 EOS 应用程序前要特别注意下面的问题: / / 1、如果要在调试应用程序时能够调试进入内核并显示对应的源码, / 必须使用 EOS 核心项目编译生成完全版本的 SDK 文件夹,然 / 后使用此文件夹覆盖应用程序项目中的 SDK 文件夹,并且 EOS / 核心项目在磁盘上的位置不能改变。 / / 2、在启动调试应用程序之前必须首先删除/禁用所有的断点,在断 /
12、 点中断 (int 3) 被命中后才能重新添加/启用断点,否则启动 / 调试会失败。 / #ifdef _DEBUG /_asm(int $3n nop); #endif /* TODO: 在此处添加自己的代码 */ INT *p; if(p=VirtualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT)/申请空间 /如果分配成功进行以下操作 printf(allocation successn); printf(allocate %d byte at %xn,sizeof(int),p);/申请空间大小 printf(Virtual memory ori
13、ginal value 0x%xn,*p);/赋值之前 *p=0xFFFFFFFF; printf(Virtual memory new value is 0x%xn,*p); printf(wait for 10 seconds n);/等10s Sleep(10000); if(VirtualFree(p,0,MEM_RELEASE)/释放 /RegionSize - 作输入时,如果参数FreeType的值为MEM_RELEASE则必须为0,否则输入 域大小。 printf(Release virtual memory successn); /期望MEM_DECOMMIT的内存大小;作输出
14、时,输出实际释放的区 ; else printf(endless loop); for(;)/死循环 printf(free failedn); else/如果分配失败 return 0; 4. 程序运行时的初值和运行结果 4.1 准备实验 按照下面的步骤准备实验: 1. 启动OS Lab。 2. 新建一个EOS Kernel项目。 printf(allocation failedn); return -1; 4.2 阅读控制台命令“pm”相关的源代码,并查看其执行的结果 阅读ke/sysproc.c文件中第1059行的ConsoleCmdPhysicalMemory函数,学习“pm”命令是如
15、何统计并输出物理存储器信息的。在阅读的过程中需要注意下面几点: 量。 l 在统计输出物理存储器信息之前要关闭中断,之后要打开中断,这样可以防止l 全局变量MiTotalPageFrameCount保存了物理页的总数。每个物理页的大小是l 全局变量MiZeroedPageCount和MiFreePageCount分别保存了零页和空闲页的数在命令执行的过程中有其它线程分配或者释放物理页。 4KB,由宏PAGE_SIZE定义。 l 计算已用物理页数量的方法是:物理页总数减去零页数量,再减去空闲页数量。 按照下面的步骤执行控制台命令“pm”,查看物理存储器的信息: 1. 按F7生成在本实验3.1中创建
16、的EOS Kernel项目。 2. 按F5启动调试。 3. 待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。 观察命令执行的结果,可以了解当前物理存储器的使用情况。 4.3 分配物理页和释放物理页 接下来,在pm命令函数中添加分配物理页和释放物理页的代码,单步调试管理物理页的方法。按照下面的步骤修改pm命令的源代码: 1. 使用OS Lab打开本实验文件夹中的pm.c文件。此文件中有一个修改后的ConsoleCmdPhysicalMemory函数,主要是在原有代码的后面增加了分配物理页和释放物理页的代码。2. 使用pm.c文件中ConsoleCmdPhysicalMemory函数的
17、函数体替换ke/sysproc.c文件中ConsoleCmdPhysicalMemory函数的函数体。 3. 按F7生成修改后的EOS Kernel项目。 4. 按F5启动调试。 5. 待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。 观察命令执行的结果,尝试说明分配物理页或者释放物理页后物理存储器的变化情况。 按照下面的步骤调试分配物理页和释放物理页的过程: 1. 结束之前的调试。 2. 在ke/sysproc.c文件的ConsoleCmdPhysicalMemory函数中,在调用MiAllocateAnyPages函数的代码行添加一个断点,在调用MiFreePages函数的代码
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验
链接地址:https://www.31ppt.com/p-3549689.html