操作系统实验物理存储器heu.docx
- 文档编号:5269265
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:11
- 大小:242.82KB
操作系统实验物理存储器heu.docx
《操作系统实验物理存储器heu.docx》由会员分享,可在线阅读,更多相关《操作系统实验物理存储器heu.docx(11页珍藏版)》请在冰豆网上搜索。
操作系统实验物理存储器heu
操作系统
实验报告
课程名称
操作系统实验
课程编号
0906553
实验项目名称
物理存储器与进程逻辑地址空间的管理
学号
年级
姓名
专业
学生所在学院
指导教师
实验室名称地点
哈尔滨工程大学
计算机科学与技术学院
第七讲物理存储器与进程逻辑地址空间的管理
一、实验概述
1.实验名称
物理存储器与进程逻辑地址空间的管理
2.实验目的
1)通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。
2)通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。
3.实验类型
验证型实验,设计型实验
4.实验内容
(1)准备实验
(2)阅读控制台命令“pm”相关的源代码,并查看其执行的结果
(3)分配物理页和释放物理页
(4)阅读控制台命令“vm”相关的源代码,并查看其执行的结果
(5)在系统进程中分配虚拟页和释放虚拟页
(6)在应用程序进程中分配虚拟页和释放虚拟页
二、实验环境
WINDOWSXP系统,EOS操作系统
三、实验过程
1.设计思路和流程图
2.算法实现
3.需要解决的问题及解答
4.主要数据结构、实现代码及其说明
5.源程序并附上注释
按照《实验指导》的P160-3.6在应用程序进程中分配虚拟页和释放虚拟页,编写代码。
#include"EOSApp.h"
intmain(intargc,char*argv[])
{
#ifdef_DEBUG
__asm("int$3\nnop");
#endif
INT*d;
/*调用API函数VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。
*/
if(d=VirtualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT)){
printf("Allocated%dbytesvirtualmemoryof0x%x\n\n",*d);
*d=0xFFFFFFFF;
/*修改整型变量的值为0xFFFFFFFF。
在修改前输出整型变量的值,在修改后再输出整型变量的值*/
printf("virtualmemoryoriginalvalue:
0x%x\n\n",*d);
printf("\nWaitfor10seconds\n");
Sleep(10000);/*调用API函数Sleep等待10秒钟。
*/
if(VirtualFree(d,0,MEM_RELEASE))/*调用API函数VirtualFree,释放之前分配的整型变量的空间。
*/
printf("\nReleasevirtualmemorysucess!
\n");
else
printf("releaseerror\n");
printf("endlessloop");
/*进入死循环,这样应用程序就不会结束。
*/
for(;;);}
else{
printf("error\n");
return-1;}
printf("Helloworld!
\n");
return0;
}
6.程序运行时的初值和运行结果
(1)阅读控制台命令“pm”相关的源代码,并查看其执行的结果:
1).按F7生成在本实验3.1中创建的EOSKernel项目。
2).按F5启动调试。
3).待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。
(2)分配物理页和释放物理页
1).使用OSLab打开本实验文件夹中的pm.c文件(将文件拖动到OSLab窗口中释放即可打开)。
此文件中有一个修改后的ConsoleCmdPhysicalMemory函数,主要是在原有代码的后面增加了分配物理页和释放物理页的代码。
2).使用pm.c文件中ConsoleCmdPhysicalMemory函数的函数体替换ke/sysproc.c文件中ConsoleCmdPhysicalMemory函数的函数体。
3).按F7生成修改后的EOSKernel项目。
4).按F5启动调试。
5).待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。
6).结束之前的调试。
7).在ke/sysproc.c文件的ConsoleCmdPhysicalMemory函数中,在调用MiAllocateAnyPages函数的代码行(第1103行)添加一个断点,在调用MiFreePages函数的代码行(第1115行)添加一个断点。
8).按F5启动调试。
9).待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。
10).pm命令开始执行后,会在调用MiAllocateAnyPages函数的代码行处中断,按F11调试进入MiAllocateAnyPages函数。
11).按F5继续执行,会在调用MiFreePages函数的代码行处中断,按F11调试进入MiFreePages函数。
(3)阅读控制台命令“vm”相关的源代码,并查看其执行的结果
1).按F5启动调试
2).待EOS启动完毕,在EOS控制台中输入命令“pt”后按回车。
“pt”命令可以输出当前系统中的进程列表,其中系统进程的ID为1
3).在EOS控制台中输入命令“vm1”后按回车。
4).在“项目管理器”窗口中双击Floppy.img文件,使用FloppyImageEditor工具打开此软盘镜
像。
5).将本实验文件夹中的LoopApp.exe文件添加到软盘镜像的根目录中(将LoopApp.exe文件拖动到FloppyImageEditor窗口中释放即可)。
EOS应用程序LoopApp.exe的源代码可以参考本实验文件夹中的LoopApp.c文件。
6).点击FloppyImageEditor工具栏上的保存按钮,关闭该工具。
7).按F5启动调试。
8).待EOS启动完毕,在EOS控制台中输入命令“A:
\LoopApp.exe”后按回车。
此时就使用EOS应用程序文件LoopApp.exe创建了一个应用程序进程,由于此进程执行了一个死循环,所以此进程不会结束执行,除非关闭虚拟机。
9).此时按Ctrl+F2切换到“Console-2”,然后输入命令“pt”后按回车。
输出的信息如图所示。
其中ID为31的进程就是应用程序进程,ID为33的线程就是应用程序进程的主线程。
10).输入命令“vm1”后按回车,可以查看系统进程中虚拟地址描述符的信息。
输出的信息如图15-5
所示。
与图15-3比较可知,3号描述符所包含的一个虚拟页即为应用程序进程的句柄表,13号描述符所包含的两个虚拟页即为应用程序进程主线程的堆栈。
11).输入命令“vm31”后按回车,可以查看应用程序进程中虚拟地址描述符的信息。
输出的信息如图所示。
(4)在系统进程中分配虚拟页和释放虚拟页
1).使用OSLab打开本实验文件夹中的vm.c文件(将文件拖动到OSLab窗口中释放即可打开)。
此文件中有一个修改后的ConsoleCmdVM函数,主要是在原有代码的后面增加了分配虚拟页和释放物理页的代码。
2).使用vm.c文件中ConsoleCmdVM函数的函数体替换ke/sysproc.c文件中ConsoleCmdVM函数的函数体。
3).按F7生成修改后的EOSKernel项目。
4).按F5启动调试。
5).待EOS启动完毕,在EOS控制台中输入命令“vm1”后按回车。
6).在ke/sysproc.c文件的ConsoleCmdVM函数中,在调用MmAllocateVirtualMemory函数的代码行(第1082行)添加一个断点,在调用MmFreeVirtualMemory函数的代码行(第1147行)添加一个断点。
7).按F5启动调试。
8).待EOS启动完毕,在EOS控制台中输入命令“vm1”后按回车。
9).vm命令开始执行后,会在调用MmAllocateVirtualMemory函数的代码行处中断。
此时要注意参数BaseAddress和RegionSize初始化的值。
按F11调试进入MmAllocateVirtualMemory函数。
10).按F10单步调试MmAllocateVirtualMemory函数的执行过程
11).按F5继续执行,会在调用MmFreeVirtualMemory函数的代码行处中断。
此时要注意参数BaseAddress和RegionSize初始化的值。
按F11调试进入MmFreeVirtualMemory函数。
12).按F10单步调试MmFreeVirtualMemory函数的执行过程
13).尝试在调用MmAllocateVirtualMemory函数时将RegionSize参数的值设置为PAGE_SIZE+1或者PAGE_SIZE*2+1。
观察“输出”窗口中转储的信息,并说明申请虚拟内存的大小与实际分配的大小之间的关系,以及分配的虚拟内存大小会对分配的虚拟地址产生什么样的影响。
将“输出”窗口中转储的信息保存在文本文件中。
14).尝试在调用MmAllocateVirtualMemory函数时将BaseAddress参数的值设置为已经被占用的虚拟内存,例如0xA0000000,观察“输出”窗口中转储的信息。
将“输出”窗口中转储的信息保存在文本文件中。
15).尝试在调用MmAllocateVirtualMemory函数时将RegionSize参数的值设置为PAGE_SIZE*2,将BaseAddress参数的值设置为0xA0017004,观察“输出”窗口中转储的信息,并说明申请虚拟内存的大小与实际分配的大小之间的关系,以及申请的虚拟地址会对分配的虚拟内存大小产生什么样的影响。
将“输出”窗口中转储的信息保存在文本文件中。
(5)在应用程序进程中分配虚拟页和释放虚拟页
1).创建一个EOS应用程序,并编写代码完成下列功能:
调用API函数VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。
修改整型变量的值为0xFFFFFFFF。
在修改前输出整型变量的值,在修改后再输出整型变量的值。
调用API函数Sleep,等待10秒钟。
调用API函数VirtualFree,释放之前分配的整型变量的空间。
进入死循环,这样应用程序就不会结束。
2).测试
代码修改完毕后,按F7生成EOS应用程序项目。
按F5启动调试,应用程序自动执行后输出的结果可以参照图15-8所示。
在应用程序分配虚拟页后,利用10秒后才释放虚拟页的间隙,可以在控制台2中执行命令
“vm31”,查看此时应用程序进程的虚拟地址描述符信息;在应用程序释放虚拟页后,可以在控制台2中再次执行命令“vm31”,查看此时应用程序进程的虚拟地址描述符信息。
输出的结果如图所示。
四、实验体会
在本次实验里我增强了对于物理存储相关知识的了解,我也知道了进程逻辑地址空间管理方法。
我学会了怎样查看物理存储器的使用情况和进程逻辑地址空间的使用情况。
我了解了如何分配和回收物理内存,虚拟内存,增强了对于课本知识的理解和记忆。
这次实验不仅让我增强了对知识的了解,更增强了我的动手能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 物理 存储器 heu