操作系统实验七-2012201124-于宝龙_第1页
操作系统实验七-2012201124-于宝龙_第2页
操作系统实验七-2012201124-于宝龙_第3页
操作系统实验七-2012201124-于宝龙_第4页
操作系统实验七-2012201124-于宝龙_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

操作系统 实 验 报 告 课程名称 操作系统实验 实验项目名称 物理存储器与进程逻辑地址空间的管理 学号 2012201124 班级 201220211 姓名 于宝龙 专业 软件工程 学生所在学院 软件学院 指导教师 曹雪 实验室名称地点 21b0284 哈尔滨工程大学 软件学院 1 一、实验概述 1. 实验名称 物理存储器与进程逻辑地址空间的管理 2. 实验目的 (1)通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌 握物理存储器的管理方法。 (2)通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存, 从而掌握进程逻辑地址空间的管理方法。 3. 实验类型 验证设计 二、实验环境 OS Lab 三、实验过程 1. 设计思路和流程图 图 3.1.1 MiAllocateAnyPages 函数的流程图 2 图 3.1.2 MiFreePages 函数的流程图 2.需要解决的问题及解答 (1) MmAllocateVirtualMemory 函数的执行过程,要求给出监视窗口 BaseAddress 和 RegionSize 个变量前后变化截图界面。 答:BaseAddress 和 RegionSize 个变量前后变化截图界面如下图所示。 图 3.2.1 进入 MmAllocateVirtualMemory 前两个变量的情况 图 3.2.2 完成 MmAllocateVirtualMemory 后两个变量的情况 (2) MmFreeVirtualMemory 函数的执行过程,要求给出监视窗口 BaseAddress 和 RegionSize 个变量前后变化截图界面。 3 答:BaseAddress 和 RegionSize 个变量前后变化截图界面如下图所示。 图 3.2.3 进入 MmFreeVirtualMemory 前两个变量的情况 图 3.2.4 完成 MmFreeVirtualMemory 后两个变量的情况 (3) 按 F10 单步调试 MiAllocateAnyPages 函数的执行过程,尝试回答下 面的问题: 本次分配的物理页的数量是多少?分配的物理页的页框号是多少? 物理页是从空闲页链表中分配的?还是从零页链表中分配的? 哪一行语句减少了空闲页的数量?哪一行语句将刚刚分配的物理页由空 闲状态修改为忙状态? 绘制 MiAllocateAnyPages 函数的流程图。 答: 本次分配的物理页的数量是 1,分配的物理页的页框号是 0x409; 物理页是从空闲页链表中分配的,; 第 226 行 MiFreePageListHead = MiGetPfnDatabaseEntry(Pfn)-Next;和第 227 行 MiFreePageCount-;减少了空闲 页的数量,第 229 行将刚刚分配的物理页由空闲状态修改为忙状态; 见实验 过程开头流程图部分。 (4) 按 F10 单步调试 MiFreePages 函数的执行过程,尝试回答下面的问 题: 本次释放的物理页的数量是多少?释放的物理页的页框号是多少?释放 的物理页是之前分配的物理页吗? 释放的物理页是被放入了空闲页链表中?还是零页链表中? 绘制 MiFreePages 函数的流程图。 答: 本次释放的物理页的数量是 1,释放的物理页的页框号 0x409,释 4 放的物理页是之前分配的物理页; 释放的物理页被放入了空闲页链表中; 见实验过程开头流程图部分。 (5) 按 F10 单步调试 MmAllocateVirtualMemory 函数的执行过程,尝试 回答下面的问题: 分配的虚拟页的起始地址是多少?分配的虚拟页的数量是多少?它们和 参数 BaseAddress 和 RegionSize 初始化的值有什么样的关系? 分配虚拟页的同时有为虚拟页映射实际的物理页吗?这是由哪个参数决 定的? 分配的虚拟页是在系统地址空间(高 2G)还是在用户地址空间(低 2G)?这是由哪个参数决定的? 参考 MiReserveAddressRegion 函数的定义和注释,说明该函数的功能。 答: 分配的虚拟页的起始地址是 0xa0003000,分配的虚拟页的数量是 1,BaseAddress 和 RegionSize 初始化的值是期望保留或者提交的地址区域的起 始地址和大小; 分配虚拟页的同时有为虚拟页映射实际的物理页,这是由第 三个参数 AllocationType 决定的; 分配的虚拟页是在系统地址空间(高 2G) , 这是由第四个参数 SystemVirtual 决定的; MiReserveAddressRegion 函数的功 能是保留一段虚拟地址区域。 (6) 按 F10 单步调试 MmFreeVirtualMemory 函数的执行过程,尝试回答 下面的问题: 本次释放的虚拟地址是多少?释放的虚拟页是之前分配的虚拟页吗? 参考 MiFindReservedAddressRegion 函数、MiFreeAddressRegion 函数和 MiDecommitPages 函数的定义和注释,说明这些函数的功能。 答: 本次释放的虚拟地址是 0xa0003000,是之前分配的虚拟页; MiFindReservedAddressRegion 函数用于查找已保留地址区域,如果目标区域非 已保留区域则返回失败,MiFreeAddressRegion 函数用于释放已保留地址区域和 MiDecommitPages 函数用于 释放映射在连续虚拟页框上的物理页框。 5 (7)在本实验 3.3 中,如果分配了物理页后,没有回收,会对 EOS 操作 系统造成什么样的影响?目前 EOS 操作系统内核函数 MiAllocateAnyPages 能 处理所有物理页被分配完毕的情况吗?例如在没有可分配的物理页的情况下调 用该内核函数,是否会返回失败?如果内核函数 MiAllocateAnyPages 还不能处 理这种极端情况,尝试修改代码解决这个问题。 答:如果分配了物理页后,没有回收,将会使可分配自由页和零页越来越 少,最终导致内存溢出,系统无法运行。目前 EOS 操作系统内核函数 MiAllocateAnyPages 不能处理所有物理页被分配完毕的情况,在没有可分配的 物理页的情况下,不会分配物理页,但仍然会返回成功,添加以下代码即可: Else return STATUS_MEMORY_NOT_ALLOCATED; (8)在本实验 3.3 中,在分配物理页时是调用的内核函数 MiAllocateAnyPages,该函数会优先分配空闲页,尝试修改代码,调用内核函数 MiAllocateZeroedPages 优先分配零页,并调试分配零页的情况。尝试从性能的 角度分析内核函数 MiAllocateAnyPages 和 MiAllocateZeroedPages。尝试从安 全性的角度分析分配零页的必要性。 答:将 MiAllocateAnyPages(1, PfnArray);修改为 MiAllocateZeroedPages(1, PfnArray);即可。系统启动时,所有空闲物理页都是未初始化的,此时零页链表 为空,MiAllocateAnyPages 函数可以直接从自由页链表分配,而 MiAllocateZeroedPages 函数会对从自由页链表中分配的每一页进行零初始化, 确保所有分配页都是被零初始化的,再进行分配,因此 MiAllocateZeroedPages 函数效率较低。但因为 MiAllocateZeroedPages 函数对自由页进行了初始化,减 小了出错的可能性,从而安全性较高。 3.源程序 #include “EOSApp.h“ 6 int main(int argc, char* argv) #ifdef _DEBUG _asm(“int $3n nop“); #endif /* TODO: 在此处添加自己的代码*/ /使用一个整型变量的指针指向这个空间 INT *p; /调用API函数VirtualAlloc ,分配一个整型变量所需的空间,并使用一个 整型变量的指针指向这个空间。 if(p=VirtualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT) printf(“Allocated %d bytes virtual memory of 0x%xnn“,sizeof(int),d); /输出原始整型变量的值 printf(“virtual memory original value:0x%xnn“,*d); /修改整型变量的值为xFFFFFFFF *p=0xFFFFFFFF; /输出修改后的整型变量的值 printf(“virtual memory new value:0x%xnn“,*d); printf(“nWait for 10 secondsn“); / 调用API函数Sleep,等待10秒钟 Sleep(10000); / 调用API函数VirtualFree,释放之前分配的整型变量的空间 if(VirtualFree(d,0,MEM_RELEASE) printf(“nRealease virtual memory success!n“); else /若释放不成功,打印输出错误 ,并返回-1 。 printf(“VirtualFree Error!n“); return -1; printf(“nEndless loop!“); /进入死循环 for(;); return 0; else /若分配不成功,打印输出错误 ,并返回-1 。 7 printf(“VirtualAlloc Error!n“); return -1; printf(“Hello world!n“); return 0; 4. 程序运行时的初值和运行结果 启动 EOS,在 EOS 控制台中输入命令“pm”后按回车,控制台输出结果 如下图所示。 使用 pm.c 文件中 ConsoleCmdPhysicalMemory 函数的函数体替换 ke/sysproc.c 文件中 ConsoleCmdPhysicalMemory 函数的函数体,待 EOS 启动完 毕,在 EOS 控制台中输入命令“pm”后按回车,控制台输出结果如下图所示。 8 在 EOS 控制台中输入命令“vm 1”后按回车,控制台输出结果如下图所示。 将 LoopApp.exe 文件添加到软盘镜像的根目录中,在 EOS 控制台中输入命 令“A:LoopApp.exe”后按回车,此时按 Ctrl+F2 切换到“Console-2 ” ,然后 输入命令“vm 1”后按回车。控制台输出如下图所示。 9 图 3.6.4 输入命令“vm 31”后按回车,可以查看应用程序进程中虚拟地址描述符的 信息。如下图所示。 图 3.6.5 使用 vm.c 文件中 ConsoleCmdVM 函数的函数体替换 ke/sysproc.c 文件中 ConsoleCmdVM 函数的函数体,待 EOS 启动完毕,在 EOS 控制台中输入命令 “vm 1”后按回车,控制台输出结果如下图所示。 10 创建一个 EOS 应用程序,并编写代码完成下列功能: 1. 调用 API 函数 VirtualAlloc,分配一个整型变量所需的空间,并使用 一个整型变量的指针指向这 个空间。 2. 修改整型变量的值为 0xFFFFFFFF。在修改前输出整型变量的值,在修 改后再输出整型变量的值。 3. 调用 API 函数 Sleep,等待 10 秒钟。 4. 调用 API 函数 VirtualFree,释放之前分配的整型变量的空间。 5. 进入死循环,这样应用程序就不会结束。 首先创建一个 EOS 应用程序,并修改其中 EOSApp.c 文

温馨提示

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

最新文档

评论

0/150

提交评论