物理存储器与进程逻辑地址空间的管理实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

操作系统实验报告课程名称操作系统实验课程编号0906553实验项目名称物理存储器与进程逻辑地址空间的管理学号年级姓名专业计算机科学与技术学生所在学院计算机科学与技术学院指导教师实验室名称地点哈尔滨工程大学计算机科学与技术学院1物理存储器与进程逻辑地址空间的管理一.实验概述:1.实验名称:物理存储器与进程逻辑地址空间的管理2.实验目的:1)通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法;2)通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。3.实验类型:验证、设计4.实验内容:1)准备实验,创建一个EOSKernel项目;2)阅读控制台命令“pm”相关的源代码,并查看其执行的结果;3)分配物理页和释放物理页;4)阅读控制台命令“vm”相关的源代码,并查看执行的结果;5)在系统进程中分配虚拟页和释放虚拟页;6)在应用程序进程中分配虚拟页和释放虚拟页。二.实验环境操作系统:windowsXP编译器:TevalatonOSLab语言:C三.实验过程1.设计思路和流程图:MiAllocateAny函数流程图:2MiFreePages函数流程图:2.实验过程:1)新建一个EOSKernel项目;2)阅读ke/sysproc.c文件中的ConsoleCmdPhysicalMemory函数,学习“pm”命令是如何统计并输出物理存储器信息的。在阅读的过程中应注意:①在统计输出物理存储器信息之前要关闭中断,之后要打开中断,这样可以防止在命令执行的过程中有其它线程分配或者释放物理页;②全局变量MiTotalPageFrameCount保存了物理页的总数。每个物理页的大小是4KB,由宏PAGE_SIZE定义;③全局变量MiZeroedPageCount和MiFreePageCount分别保存了零页和空闲页的数量;④计算已用物理页数量的方法是:物理页总数减去零页数量,再减去空闲页数量。3)生成所创建的项目,启动调试,待EOS启动完毕,在EOS控制台中输入命令“pm”后回车,观察命令执行的结果。34)将修改后的ConsoleCmdPhysicalMemory函数进行替换,主要是在原有代码的后面添加了分配物理页和释放物理页的代码,生成修改后的EOSKernel项目,启动调试,待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车;5)结束调试,在调用MiAllocateAnyPages函数的代码行添加一个断点,在调用MiFreePages函数的代码行添加一个断点;6)启动调试,待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车,pm命令开始执行后,会在调用MiAllocateAnyPages函数的代码行处中断,按F11(逐语句)调试进入MiAllocateAnyPages函数;4按F10(逐过程)单步调试MiAllocateAnyPages函数的执行过程:7)继续执行,,会在调用MiFreePages函数的代码行处中断,按F11(逐语句)调试进入MiFreePages函数;按F10(逐过程)单步调试MiFreePages函数的执行过程:568)阅读控制台命令“vm”相关的代码,并查看执行结果。阅读ke/sysproc.c文件中的ConsoleCmdVM函数,学习“vm”命令是如何统计并输出进程的虚拟地址描述符信息的,注意一下几点:①与“pm””命令输出的是整个系统的物理存储器的使用情况不同,“vm”命令输出的是某个进程的虚拟地址描述符信息,所以“vm”命令使用了一个参数——进程ID,用来指定一个进程。这个进程既可以是系统进程,也可以是用户进程;②在统计输出指定进程的虚拟地址描述符信息之前要关闭中断,之后要打开中断,这样可以防止在命令执行的过程中有其它线程分配或者释放虚拟页;③EOS操作系统的进程有4G的虚拟地址空间,但并不是所有的虚拟地址空间都使用虚拟地址描述符来管理,有一些地址空间是静态的,还有一些地址空间由其他的动态方式来管理(例如系统内存池);④进程4G虚拟地址空间中由虚拟地址描述符所管理空间的低地址和高地址是固定的,在这段地址空间中,如果有虚拟页被占用,就会使用虚拟地址描述符来标识,并放入链表中管理;9)启动调试,待EOS启动完毕,在EOS控制台中输入命令“pt”后按回车。“pt”命令可以输出当前系统中的进程列表,其中系统进程的ID为1;在EOS控制台中输入命令“vm1”后按回车,观察命令执行的结果:7系统进程中由虚拟地址描述符所管理的虚拟页只会分配给进程的句柄表(句柄表占用一个虚拟页)和线程的堆栈(堆栈占用两个虚拟页)。结合之前“pt”命令输出的进程和线程信息可知,当前系统中只有1个系统进程以及10个系统线程,所以在上图中,1号描述符所包含的一个虚拟页即为系统进程的句柄表,而2到11号这10个描述符所分别包含的两个虚拟页即为10个系统线程的堆栈。10)将LoopApp.exe文件添加到软盘镜像的根目录中,并保存,启动调试,待EOS启动完毕,在EOS控制台中输入命令“A:\LoopApp.exe”后按回车。此时就使用EOS应用程序文件LoopApp.exe创建了一个应用程序进程,由于此进程执行了一个死循环,所以此进程不会结束执行,除非关闭虚拟机;11)切换到“Console-2”,然后输入命令“pt”后按回车。输出的信息如图所示。其中ID为31的进程就是应用程序进程,ID为33的线程就是应用程序进程的主线程;812)输入命令“vm1”后按回车,可以查看系统进程中虚拟地址描述符的信息。输出的信息如图所示。与第9步图比较可知,3号描述符所包含的一个虚拟页即为应用程序进程的句柄表,13号描述符所包含的两个虚拟页即为应用程序进程主线程的堆栈;13)输入命令“vm31”后按回车,可以查看应用程序进程中虚拟地址描述符的信息;9在进程的4G逻辑地址空间中,应用程序进程可以自行管理低2G的用户空间。从图15-6中的信息可以得知,低2G的用户空间又被分为了三部分:①0x00000000-0x0000FFFF由16个虚拟页构成的64KB静态空间,用于捕捉对空指针的非法访问;②0x00010000-0x7FFEFFFF由虚拟地址描述符管理的动态空间,用于存储应用程序进程的代码和数据。上图显示应用程序进程的代码和数据占用了此空间中的5个虚拟页,并且是用从应用程序的基址0x00400000起始的;③0x7FFF0000-0x7FFFFFFF由16个虚拟页构成的64KB静态空间,用于捕捉对空指针的非法访问。14)在系统进程中分配虚拟页和释放虚拟页,使用修改后的ConsoleCmdVM函数的函数体替换ke/sysproc.c文件中ConsoleCmdVM函数的函数体,生成修改后的EOSKernel项目,启动调试,待EOS启动完毕,在EOS控制台中输入命令“vm1”后按回车;1015)在ke/sysproc.c文件的ConsoleCmdVM函数中,在调用MmAllocateVirtual——Memory函数的代码行添加一个断点,在调用MmFreeVirtualMemory函数的代码行添加一个断点;16)启动调试,待EOS启动完毕,在EOS控制台中输入命令“vm1”后按回车,vm命令开始执行后,会在调用MmAllocateVirtualMemory函数的代码行处中断。此时要注意参数BaseAddress和RegionSize初始化的值。按F11(逐过程)调试进入MmAllocateVirtualMemory函数;1117)按F10(逐过程)单步调试MmAllocateVirtualMemory函数的执行过程,继续执行,,会在调用MmFreeVirtualMemory函数的代码行处中断。此时要注意参数BaseAddress和RegionSize初始化的值。按F11调试进入MmFreeVirtualMemory函数;121318)尝试在调用MmAllocateVirtualMemory函数时将RegionSize参数的值设置为PAGE_SIZE+1或者PAGE_SIZE*2+1。观察“输出”窗口中转储的信息,并说明申请虚拟内存的大小与实际分配的大小之间的关系,以及分配的虚拟内存大小会对分配的虚拟地址产生什么样的影响。将“输出”窗口中转储的信息保存在文本文件中;19)尝试在调用MmAllocateVirtualMemory函数时将BaseAddress参数的值设置为已经被占用的虚拟内存,例如0xA0000000,观察“输出”窗口中转储的信息。将“输出”窗口中转储的信息保存在文本文件中;1420)尝试在调用MmAllocateVirtualMemory函数时将RegionSize参数的值设置为PAGE_SIZE*2,将BaseAddress参数的值设置为0xA0017004,观察“输出”窗口中转储的信息,并说明申请虚拟内存的大小与实际分配的大小之间的关系,以及申请的虚拟地址会对分配的虚拟内存大小产生什么样的影响。将“输出”窗口中转储的信息保存在文本文件中;21)创建一个EOS应用程序,调用API函数VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。修改整型变量的值为0xFFFFFFFF。在修改前输出整型变量的值,在修改后再输出整型变量的值。调用API函数Sleep,等待10秒钟,调用API函数VirtualFree,释放之前分配的整型变量的空间,进入死循环,这样应用程序就不会结束。#include“EOSApp.h”intmain(intargc,char*argv[]){//启动调试EOS应用程序前要特别注意下面的问题://1、如果要在调试应用程序时能够调试进入内核显示对应的源码,必须使用EOS核心项目编译生成完全版本的SDK文件夹,然后使用此文件夹覆盖应用程序项目中的SDK文件夹,并且EOS核心项目在磁盘上的位置不能改变。2、在启动调试应用程序之前必须首先删除禁用所有的断点,在断点中断(int3)被命中后才能重新添加启用断点,否则启动调试会失败。#ifdef_DEBUG_asm(“int$3\nnop”);#endifINT*p;//调用API函数VirtualAlloc,分配一个整型变量所需的空间,并使用一个整15型变量的指针指向这个空间If(p=VirtualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT)){printf(“Allocated%dbytesvirtualmemoryof0x%x\n\n”,sizeof(int),d);//输出原始整型变量的值printf(virtualmemoryoriginalvalue:0x%x\n\n,p);//修改整型变量的值为0xFFFFFFFF*p=0xFFFFFFFF;//输出修改后的整型变量的值printf(virtualmemorynewvalue:0x%x\n\n,*p);printf(\nWaitfor10seconds\n);//调用API函数Sleep,等待10秒钟Sleep(10000);//调用API函数VirtualFree,释放之前分配的整型变量的空间if(VirtualFree(p,0,MEM_RELEASE))printf(\nRealeasevirtualmemorysuccess!\n);else{//若释放不成功,打印输出错误,并返回-1。printf(VirtualFreeError!\n);return-1;}return0;}22)代码修改完毕后,生成EOS应用程序项目,启动调试,输出结果如图所示。在应用程序分配虚拟页后,利用10秒后才释放虚拟页的间隙,可以在控制台2中执行命令“vm31”,查看此时应用程序进程的虚拟地址描述符信息,在应用程序释放虚拟页后,可以在控制台2中再次执行命令“vm31”,查看此时应用程序进程的虚拟地址描述符信息。16提示:API函数VirtualAlloc定义在api/eosap

1 / 18
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功