ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:527.85KB ,
资源ID:7384773      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7384773.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(061324张耀第四讲 物理存储器与进程逻辑地址空间的管理.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

061324张耀第四讲 物理存储器与进程逻辑地址空间的管理.docx

1、061324张耀第四讲 物理存储器与进程逻辑地址空间的管理操作系统实 验 报 告课程名称操作系统实验课程编号0906553实验项目名称物理存储器与进程逻辑地址空间的管理学号2011061324年级2011姓名张耀专业计算机科学与技术学生所在学院计算机科学与技术指导教师印桂生实验室名称地点21B276 哈尔滨工程大学计算机科学与技术学院第四讲 物理存储器与进程逻辑地址空间的管理一、实验概述1. 实验名称物理存储器与进程逻辑地址空间的管理2. 实验目的(1)通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法; (2)通过查看进程逻辑地址空间的使用情况,并练习分配和

2、回收虚拟内存,从而掌握进程逻辑地址空间的。管理方法。3. 实验类型验证性和设计性实验4. 实验内容(1)准备实验;(2)执行控制台命令“pm”,查看物理存储器的信息;(3)分配物理页和释放物理页;(4)阅读控制台命令“vm”相关的源代码,并查看其执行的结果;(5)在系统进程中分配虚拟页和释放虚拟页;(6)在应用程序进程中分配虚拟页和释放虚拟页。二、实验环境在OS Lab实验环境的基础上,利用EOS操作系统,由汇编语言及C语言编写代码,对需要的项目进行生成、调试、查看和修改,并通过EOS应用程序使内核从源代码变为可以在虚拟机上使用。三、实验过程1. 设计思路和流程图图 3.1.1 MiAlloc

3、ateAnyPages函数的流程图图 3.1.2 MiFreePages函数的流程图2. 需要解决的问题及解答(1) MmAllocateVirtualMemory函数的执行过程,要求给出监视窗口BaseAddress和RegionSize个变量前后变化截图界面。答:BaseAddress和RegionSize个变量前后变化截图界面如下图所示。图 3.2.1 进入MmAllocateVirtualMemory前两个变量的情况图 3.2.2 完成MmAllocateVirtualMemory后两个变量的情况(2) MmFreeVirtualMemory函数的执行过程,要求给出监视窗口BaseAd

4、dress和RegionSize个变量前后变化截图界面。答:BaseAddress和RegionSize个变量前后变化截图界面如下图所示。图 3.2.3 进入MmFreeVirtualMemory前两个变量的情况图 3.2.4 完成MmFreeVirtualMemory后两个变量的情况(3) 按 F10单步调试MiAllocateAnyPages函数的执行过程,尝试回答下面的问题: 本次分配的物理页的数量是多少?分配的物理页的页框号是多少? 物理页是从空闲页链表中分配的?还是从零页链表中分配的? 哪一行语句减少了空闲页的数量?哪一行语句将刚刚分配的物理页由空闲状态修改为忙状态? 绘制 MiAl

5、locateAnyPages函数的流程图。 答: 本次分配的物理页的数量是1,分配的物理页的页框号是0x409; 物理页是从空闲页链表中分配的,; 第226行MiFreePageListHead = MiGetPfnDatabaseEntry(Pfn)-Next;和第227行MiFreePageCount-;减少了空闲页的数量,第229行将刚刚分配的物理页由空闲状态修改为忙状态; 见实验过程开头流程图部分。(4) 按 F10单步调试MiFreePages函数的执行过程,尝试回答下面的问题: 本次释放的物理页的数量是多少?释放的物理页的页框号是多少?释放的物理页是之前分配的物理页吗? 释放的物理

6、页是被放入了空闲页链表中?还是零页链表中? 绘制 MiFreePages函数的流程图。 答: 本次释放的物理页的数量是1,释放的物理页的页框号0x409,释放的物理页是之前分配的物理页; 释放的物理页被放入了空闲页链表中; 见实验过程开头流程图部分。 (5) 按 F10单步调试MmAllocateVirtualMemory函数的执行过程,尝试回答下面的问题: 分配的虚拟页的起始地址是多少?分配的虚拟页的数量是多少?它们和参数BaseAddress和RegionSize初始化的值有什么样的关系? 分配虚拟页的同时有为虚拟页映射实际的物理页吗?这是由哪个参数决定的? 分配的虚拟页是在系统地址空间(

7、高2G)还是在用户地址空间(低2G)?这是由哪个参数决定的? 参考 MiReserveAddressRegion函数的定义和注释,说明该函数的功能。答: 分配的虚拟页的起始地址是0xa0003000,分配的虚拟页的数量是1,BaseAddress和RegionSize初始化的值是期望保留或者提交的地址区域的起始地址和大小; 分配虚拟页的同时有为虚拟页映射实际的物理页,这是由第三个参数AllocationType决定的; 分配的虚拟页是在系统地址空间(高2G),这是由第四个参数SystemVirtual决定的; MiReserveAddressRegion函数的功能是保留一段虚拟地址区域。(6)

8、 按 F10单步调试MmFreeVirtualMemory函数的执行过程,尝试回答下面的问题: 本次释放的虚拟地址是多少?释放的虚拟页是之前分配的虚拟页吗? 参考 MiFindReservedAddressRegion函数、MiFreeAddressRegion函数和MiDecommitPages函数的定义和注释,说明这些函数的功能。 答: 本次释放的虚拟地址是0xa0003000,是之前分配的虚拟页; MiFindReservedAddressRegion函数用于查找已保留地址区域,如果目标区域非已保留区域则返回失败,MiFreeAddressRegion函数用于释放已保留地址区域和MiDe

9、commitPages函数用于释放映射在连续虚拟页框上的物理页框。 (7)在本实验 3.3 中,如果分配了物理页后,没有回收,会对 EOS 操作系统造成什么样的影响?目前 EOS操作系统内核函数 MiAllocateAnyPages 能处理所有物理页被分配完毕的情况吗?例如在没有可分配的物理页的情况下调用该内核函数,是否会返回失败?如果内核函数 MiAllocateAnyPages 还不能处理这种极端情况,尝试修改代码解决这个问题。答:如果分配了物理页后,没有回收,将会使可分配自由页和零页越来越少,最终导致内存溢出,系统无法运行。目前 EOS操作系统内核函数 MiAllocateAnyPage

10、s 不能处理所有物理页被分配完毕的情况,在没有可分配的物理页的情况下,不会分配物理页,但仍然会返回成功,添加以下代码即可:Elsereturn STATUS_MEMORY_NOT_ALLOCATED;(8)在本实验 3.3 中,在分配物理页时是调用的内核函数 MiAllocateAnyPages,该函数会优先分配空闲页,尝试修改代码,调用内核函数MiAllocateZeroedPages优先分配零页,并调试分配零页的情况。尝试从性能的角度分析内核函数 MiAllocateAnyPages 和 MiAllocateZeroedPages。尝试从安全性的角度分析分配零页的必要性。答:将MiAllo

11、cateAnyPages(1, PfnArray);修改为MiAllocateZeroedPages(1, PfnArray);即可。系统启动时,所有空闲物理页都是未初始化的,此时零页链表为空,MiAllocateAnyPages函数可以直接从自由页链表分配,而MiAllocateZeroedPages函数会对从自由页链表中分配的每一页进行零初始化,确保所有分配页都是被零初始化的,再进行分配,因此MiAllocateZeroedPages函数效率较低。但因为MiAllocateZeroedPages函数对自由页进行了初始化,减小了出错的可能性,从而安全性较高。4. 主要数据结构、实现代码及其说

12、明typedef struct _MMPFN ULONG Unused : 9; / 未用 ULONG PageState : 3; / 物理页的状态 ULONG Next : 20; / 下一个物理页的页框号 MMPFN, *PMMPFN; typedef enum _PAGE_STATE ZEROED_PAGE, / 零页 FREE_PAGE, / 自由页 BUSY_PAGE, / 占用页 PAGE_STATE; / 虚拟地址描述符typedef struct _MMVAD ULONG_PTR StartingVpn; / 被使用区域的开始虚页框号 ULONG_PTR EndVpn; /

13、被使用区域的结束虚页框号 LIST_ENTRY VadListEntry; / 链表项,用于将描述同一地址空间的所有VAD串成链表 MMVAD, *PMMVAD;/ 虚拟地址描述符链表typedef struct _MMVAD_LIST ULONG_PTR StartingVpn; / 记录的进程地址空间的开始虚页号 ULONG_PTR EndVpn; / 记录的进程地址空间的结束虚页号 LIST_ENTRY VadListHead; / VAD链表头 MMVAD_LIST, *PMMVAD_LIST;实现代码如下:if(p=VirtualAlloc(0,sizeof(int),MEM_RES

14、ERVE|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,等待秒钟 Sleep(10000

15、); / 调用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。 printf(VirtualAlloc Error!n); return -1; 5

16、. 源程序并附上注释#include EOSApp.hint 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

17、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,等待秒钟 Sleep(10000); / 调用API函数VirtualFree,释放之前分配的整型变量的空间 if(VirtualFree(d,0,MEM

18、_RELEASE) printf(nRealease virtual memory success!n); else /若释放不成功,打印输出错误,并返回-1。 printf(VirtualFree Error!n); return -1; printf(nEndless loop!); /进入死循环 for(;); return 0; else /若分配不成功,打印输出错误,并返回-1。 printf(VirtualAlloc Error!n); return -1; printf(Hello world!n); return 0;6. 程序运行时的初值和运行结果启动EOS,在EOS控制台中

19、输入命令“pm”后按回车,控制台输出结果如下图所示。图 3.6.1由图中我们可以看出,系统共有物理页8176个,内存大小33488896 Byte,零页0个,自由页7126个,占用页1050个。使用 pm.c 文件中 ConsoleCmdPhysicalMemory 函数的函数体替换 ke/sysproc.c 文件中ConsoleCmdPhysicalMemory函数的函数体,待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车,控制台输出结果如下图所示。图3.6.2从图中我们看出,分配了一个物理页后,零页数量不变,自由页数量减一,占用页数量加一;释放一个物理页后,零页数量不变,自由页数

20、量加一,占用页数量减一。在 EOS控制台中输入命令“vm 1”后按回车,控制台输出结果如下图所示。图 3.6.3如图所示,1 号描述符所包含的一个虚拟页即为系统进程的句柄表,而 2到11号这10个描述符所分别包含的两个虚拟页即为 10个系统线程的堆栈。将 LoopApp.exe 文件添加到软盘镜像的根目录中,在EOS控制台中输入命令“A:LoopApp.exe”后按回车,此时按 Ctrl+F2 切换到“Console-2” ,然后输入命令“vm 1”后按回车。控制台输出如下图所示。图 3.6.4输入命令“vm 31”后按回车,可以查看应用程序进程中虚拟地址描述符的信息。如下图所示。图 3.6.

21、5使用 vm.c文件中 ConsoleCmdVM函数的函数体替换ke/sysproc.c文件中ConsoleCmdVM函数的函数体,待 EOS启动完毕,在EOS控制台中输入命令“vm 1”后按回车,控制台输出结果如下图所示。图 3.6.6创建一个EOS 应用程序,并编写代码完成下列功能: 1. 调用 API 函数 VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。 2. 修改整型变量的值为0xFFFFFFFF。在修改前输出整型变量的值,在修改后再输出整型变量的值。 3. 调用API函数 Sleep,等待 10秒钟。 4. 调用 API 函数 Virtu

22、alFree,释放之前分配的整型变量的空间。 5. 进入死循环,这样应用程序就不会结束。 首先创建一个EOS应用程序,并修改其中EOSApp.c文件的代码,如下图所示。图3.6.7代码修改完毕后,按 F5启动调试,应用程序自动执行,控制台输出结果如下图所示。图 3.6.8在控制台2中执行命令“vm 31”,查看此时应用程序进程的虚拟地址描述符信息;在应用程序释放虚拟页后,可以在控制台2中再次执行命令“vm 31”,查看此时应用程序进程的虚拟地址描述符信息。如下图所示。图 3.6.9四、实验体会本次实验中,我通过调试EOS操作系统对物理存储空间和虚拟存储空间的分配和回收函数,对操作系统的内存管理机制和实现有了更深一步的认识,并通过调用API函数自己设计了在应用程序进程中分配虚拟页和释放虚拟页的程序。通过编程,我也捋清了虚拟内存分配和释放时的函数调用关系,并通过阅读函数源码了解了具体的逻辑顺序,也学习到了一些编程的方式。本次实验同样是一次对于课堂知识的实践,带给我很多启发。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1