操作系统实验七Word文档下载推荐.docx
《操作系统实验七Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统实验七Word文档下载推荐.docx(17页珍藏版)》请在冰点文库上搜索。
实验室名称地点
一、实验概述
1.实验名称
物理存储器与进程逻辑地址空间的管理
2.实验目的
熟悉操作系统集成实验环境OSLab的基本使用方法。
练习编译、调试EOS操作系统内核以及EOS应用程序。
3.实验类型
验证
二、实验环境
OSLab
三、实验过程
3.2执行控制台命令“pm”,查看物理存储器的信息
3.3分配物理页和释放物理页
在1091和1103行插入断点
监视分配物理页
释放物理页
按F10单步调试MiAllocateAnyPages函数的执行过程,尝试回答下面的问题:
(1)本次分配的物理页的数量是1,分配的页框号是0x409
(2)物理页是从空闲页链表中分配的
(3)第226和227行:
MiFreePageListHead=MiGetPfnDatabaseEntry(Pfn)->
Next;
MiFreePageCount--;
减少了空闲页的数量;
第229行将刚刚分配的物理页由空闲状态改为忙状态
(4)MiAllocateAnyPages函数的流程图
按F10单步调试MiFreePages函数的执行过程,尝试回答下面的问题:
(1)本次释放的物理页数为1,释放的物理页的页框号是0x409,释放的物理页是之前分配的物理页码
(2)释放的物理页被放入了空闲链表
(3)MiFreePages函数流程图
将分配和释放的物理页数设为2,调试后运行结果:
3.4阅读控制台命令“vm”相关的源代码,并查看其执行的结果
输入命令pt
输入命令vm1
导入LoopApp.exe,输入命令A:
\LoopApp.exe后
输入pt后
输入vm1后
输入vm31后
3.5在系统进程中分配虚拟页和释放虚拟页
输入vm1命令后
输入vm1命令后在MmAllocateVirtualMemory函数处中断
此时BaseAddress和RegionSize初始值
进入MmAllocateVirtualMemory函数
调试MmAllocateVirtualMemory函数完成后
按F10单步调试MmAllocateVirtualMemory函数的执行过程中,尝试回答下列问题:
(1)分配的虚拟页的起始地址是0xa0003000,分配的虚拟页数量是1,BaseAddress和RegionSize初始化的值是期望保留或者提交的地址区域的起始地址和大小
(2)分配虚拟页的同时有为虚拟页映射实际的物理页,是由第三个参数AllocationType决定的
(3)分配的虚拟页是在系统地址空间(高2G),是由第四个参数SystemVirtual决定的
(4)MiReserveAddressRegion函数的功能是保留一段虚拟地址区域
按F5继续调试,在调用MmFreeVirtualMemory函数的代码行处中断
按F11调试进入MmFreeVirtualMemory函数
调试MmFreeVirtualMemory函数完毕后
按F10单步调试MmFreeVirtualMemory函数的执行过程中,尝试回答下列问题:
(1)本次释放的虚拟地址是0xa0003000,释放的虚拟页是之前分配的虚拟页
(2)MiFindReservedAddressRegion函数用于查找以保留地址区域,如果目标区域不是已保留区域则返回失败;
MiFreeAddressRegion函数用于释放已保留地址区域;
MiDecommitPages函数用于释放映射在连续虚拟页框上的物理页框
将RegionSize的值设置为PAGE_SIZE+1后
设置为PAGE_SIZE*2+1后
将BaseAddress参数的值设置为已经被占用的虚拟内存0xA0000000
将RegionSize的值设置为PAGE_SIZE*2BaseAddress参数的值设置为0x0017004
3.6在应用程序进程中分配虚拟页和释放虚拟页
代码如下:
#include"
EOSApp.h"
intmain(intargc,char*argv[])
{
#ifdef_DEBUG
__asm("
int$3\nnop"
);
#endif
INT*d;
if(d=VirtualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT))
printf("
Allocated%dbytesvirtualmemoryof0x%x\n\n"
sizeof(int),d);
printf("
virtualmemoryoriginalvalue:
0x%x\n\n"
*d);
*d=0xFFFFFFFF;
virtualmemorynewvalue:
\nWaitfor10seconds\n"
Sleep(10000);
if(VirtualFree(d,0,MEM_RELEASE))
\nRealeasevirtualmemorysuccess!
\n"
else
//若释放不成功,打印输出错误,并返回-1。
VirtualFreeError!
return-1;
}
\nEndlessloop!
"
//进入死循环
for(;
;
){;
}
return0;
else
//若分配不成功,打印输出错误,并返回-1。
VirtualAllocError!
return-1;
Helloworld!
return0;
按F5调试
此时在控制台2中输入vm31
10秒后
此时在控制台2中输入vm31
四、思考题
五、实验体会
通过本次实验,练习分配和回收物理内存,我掌握了物理存储器的管理方法,通过查看进程逻辑地址空间的使用情况并练习分配和回收虚拟内存,掌握了进程逻辑地址空间的管理方法。