物理存储器与进程逻辑地址空间的管理Word文档格式.doc
《物理存储器与进程逻辑地址空间的管理Word文档格式.doc》由会员分享,可在线阅读,更多相关《物理存储器与进程逻辑地址空间的管理Word文档格式.doc(8页珍藏版)》请在冰豆网上搜索。
指导教师
实验室名称地点
计算机软件第一实验室
哈尔滨工程大学
一、实验概述
1.实验名称
物理存储器与进程逻辑地址空间的管理。
2.实验目的
通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。
通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。
3.实验类型
验证,设计。
4.实验内容
准备实验:
启动OSLab。
新建一个EOSKernel项目。
执行控制台命令“pm”,查看物理存储器的信息:
按F7生成在本实验3.1中创建的EOSKernel项目。
按F5启动调试。
待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。
修改pm命令的源代码:
使用OSLab打开本实验文件夹中的pm.c文件(将文件拖动到OSLab窗口中释放即可打开)。
此文件中有一个修改后的ConsoleCmdPhysicalMemory函数,主要是在原有代码的后面增加了分配物理页和释放物理页的代码。
使用pm.c文件中ConsoleCmdPhysicalMemory函数的函数体替换ke/sysproc.c文件中ConsoleCmdPhysicalMemory函数的函数体。
按F7生成修改后的EOSKernel项目。
分配物理页和释放物理页:
结束之前的调试。
在ke/sysproc.c文件的ConsoleCmdPhysicalMemory函数中,在调用MiAllocateAnyPages函数的代码行(第1103行)添加一个断点,在调用MiFreePages函数的代码行(第1115行)添加一个断点。
pm命令开始执行后,会在调用MiAllocateAnyPages函数的代码行处中断,按F11调试进入MiAllocateAnyPages函数。
按F10单步调试MiAllocateAnyPages函数的执行过程。
按F5继续执行,会在调用MiFreePages函数的代码行处中断,按F11调试进入MiFreePages函数。
按F10单步调试MiFreePages函数的执行过程。
执行控制台命令“vm”,查看系统进程的虚拟地址描述符信息:
待EOS启动完毕,在EOS控制台中输入命令“pt”后按回车。
“pt”命令可以输出当前系统中的进程列表,其中系统进程的ID为1。
在EOS控制台中输入命令“vm1”后按回车。
观察命令执行的结果。
执行控制台命令“vm”,查看当创建了一个应用程序进程后,系统进程和应用程序进程中虚拟地址描述符的信息:
在“项目管理器”窗口中双击Floppy.img文件,使用FloppyImageEditor工具打开此软盘镜像。
将本实验文件夹中的LoopApp.exe文件添加到软盘镜像的根目录中(将LoopApp.exe文件拖动到FloppyImageEditor窗口中释放即可)。
EOS应用程序LoopApp.exe的源代码可以参考本实验文件夹中的LoopApp.c文件。
点击FloppyImageEditor工具栏上的保存按钮,关闭该工具。
待EOS启动完毕,在EOS控制台中输入命令“A:
\LoopApp.exe”后按回车。
此时按Ctrl+F2切换到“Console-2”,然后输入命令“pt”后按回车。
输入命令“vm1”后按回车,可以查看系统进程中虚拟地址描述符的信息。
输入命令“vm31”后按回车,可以查看应用程序进程中虚拟地址描述符的信息。
在系统进程中分配虚拟页和释放虚拟页:
使用OSLab打开本实验文件夹中的vm.c文件(将文件拖动到OSLab窗口中释放即可打开)。
此文件中有一个修改后的ConsoleCmdVM函数。
使用vm.c文件中ConsoleCmdVM函数的函数体替换ke/sysproc.c文件中ConsoleCmdVM函数的函数体。
按F7生成修改后的EOSKernel项目。
待EOS启动完毕,在EOS控制台中输入命令“vm1”后按回车。
调试分配虚拟页和释放虚拟页的过程:
在ke/sysproc.c文件的ConsoleCmdVM函数中,在调用MmAllocateVirtualMemory函数的代码行(第1082行)添加一个断点,在调用MmFreeVirtualMemory函数的代码行(第1147行)添加一个断点。
vm命令开始执行后,会在调用MmAllocateVirtualMemory函数的代码行处中断。
此时要注意参数BaseAddress和RegionSize初始化的值。
按F11调试进入MmAllocateVirtualMemory函数。
按F10单步调试MmAllocateVirtualMemory函数的执行过程,观察命令执行的结果。
调试释放虚拟页的过程:
按F5继续执行,会在调用MmFreeVirtualMemory函数的代码行处中断。
按F11调试进入MmFreeVirtualMemory函数。
按F10单步调试MmFreeVirtualMemory函数的执行过程。
创建一个EOS应用程序,并编写代码完成下列功能:
调用API函数VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。
修改整型变量的值为0xFFFFFFFF。
在修改前输出整型变量的值,在修改后再输出整型变量的值。
调用API函数Sleep,等待10秒钟。
调用API函数VirtualFree,释放之前分配的整型变量的空间。
进入死循环,这样应用程序就不会结束。
测试方法:
代码修改完毕后,按F7生成EOS应用程序项目。
在应用程序分配虚拟页后,利用10秒后才释放虚拟页的间隙,可以在控制台2中执行命令“vm31”,查看此时应用程序进程的虚拟地址描述符信息;
在应用程序释放虚拟页后,可以在控制台2中再次执行命令“vm31”,查看此时应用程序进程的虚拟地址描述符信息。
二、实验环境
操作系统集成实验环境:
OSLab
语言:
C语言
三、实验过程
设计思路和流程图:
分页管理物理存储器:
4.主要数据结构、实现代码及其说明:
INT*d;
if(d=VirtualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT)){//调用API函数VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间
printf("
Allocated%dbytesvirtualmemoryof0x%x\n\n"
sizeof(int),d);
virtualmemoryoriginalvalue:
0x%x\n\n"
*d);
*d=0xFFFFFFFF;
//修改整型变量的值为0xFFFFFFFF
virtualmemorynewvalue:
\nWaitfor10seconds\n"
);
Sleep(10000);
//调用API函数Sleep,等待10秒钟。
if(VirtualFree(d,0,MEM_RELEASE))//调用API函数VirtualFree,释放之前分配的整型变量的空间
\nRealeasevirtualmemorysuccess!
\n"
else
printf("
realeaseerror\n"
\nEndlessloop!
"
for(;
;
}
else
{
error\n"
return-1;
//若不能成功分配,打印出error,返回-1.
}
printf("
Helloworld!
return0;
6.程序运行时的初值和运行结果:
四、实验体会
通过本次试验,我们练习了分配和回收物理内存,懂得物理存储器的管理方法,并且通过查看进程逻辑地址空间的使用情况来练习分配和回收虚拟内存,从而更好地掌握进程逻辑地址空间的管理方法。
而且每次当自己成功的被检查通过时,心里的高兴可以持续好久。
所以实验不仅给我们知识上的满足还给我们心里的满足。
7