物理存储器与进程逻辑地址空间地管理系统Word格式.docx
《物理存储器与进程逻辑地址空间地管理系统Word格式.docx》由会员分享,可在线阅读,更多相关《物理存储器与进程逻辑地址空间地管理系统Word格式.docx(15页珍藏版)》请在冰点文库上搜索。
第五次物理存储器与进程逻辑地址空间的管理
一、实验概述
1.实验名称
2.实验目的
通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。
通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。
3.实验类型
验证+设计
4.实验内容
准备实验
阅读控制台命令“pm”相关的源代码,并查看其执行的结果
分配物理页和释放物理页
阅读控制台命令“vm”相关的源代码,并查看其执行的结果
在系统进程中分配虚拟页和释放虚拟页
在应用程序进程中分配虚拟页和释放虚拟页
二、实验环境
EOS操作系统和OSLab集成实验环境,主要运用了C语言。
三、实验过程
1.设计思路和流程图
2.需要解决的问题及解答
1)按F10单步调试MiAllocateAnyPages函数的执行过程,尝试回答下面的问题:
(1)本次分配的物理页的数量是多少?
分配的物理页的页框号是多少?
(2)物理页是从空闲页链表中分配的?
还是从零页链表中分配的?
(3)哪一行语句减少了空闲页的数量?
哪一行语句将刚刚分配的物理页由空闲状态修改为忙状态?
(4)绘制MiAllocateAnyPages函数的流程图。
答:
①本次分配的物理页的数量是1,分配的物理页的页框号是0x409;
②物理页是从空闲页链表中分配的③第226行MiFreePageListHead=MiGetPfnDatabaseEntry(Pfn)->
Next;
和第227行MiFreePageCount--;
减少了空闲页的数量,第229行将刚刚分配的物理页由空闲状态修改为忙状态;
④见实验过程开头流程图部分。
2)按F10单步调试MiFreePages函数的执行过程,尝试回答下面的问题:
(1)本次释放的物理页的数量是多少?
释放的物理页的页框号是多少?
释放的物理页是之前分配的物理页吗?
(2)释放的物理页是被放入了空闲页链表中?
还是零页链表中?
(3)绘制MiFreePages函数的流程图。
①本次释放的物理页的数量是1,释放的物理页的页框号0x409,释放的物理页是之前分配的物理页;
②释放的物理页被放入了空闲页链表中;
③见实验过程开头流程图部分。
3)按F10单步调试MmAllocateVirtualMemory函数的执行过程,尝试回答下面的问题:
(1)分配的虚拟页的起始地址是多少?
分配的虚拟页的数量是多少?
它们和参数BaseAddress和RegionSize初始化的值有什么样的关系?
(2)分配虚拟页的同时有为虚拟页映射实际的物理页吗?
这是由哪个参数决定的?
(3)分配的虚拟页是在系统地址空间(高2G)还是在用户地址空间(低2G)?
(4)参考MiReserveAddressRegion函数的定义和注释,说明该函数的功能。
①分配的虚拟页的起始地址是0xa0003000,分配的虚拟页的数量是1,BaseAddress和RegionSize初始化的值是期望保留或者提交的地址区域的起始地址和大小;
②分配虚拟页的同时有为虚拟页映射实际的物理页,这是由第三个参数AllocationType决定的;
③分配的虚拟页是在系统地址空间(高2G),这是由第四个参数SystemVirtual决定的;
④MiReserveAddressRegion函数的功能是保留一段虚拟地址区域。
4)按F10单步调试MmFreeVirtualMemory函数的执行过程,尝试回答下面的问题:
①本次释放的虚拟地址是多少?
释放的虚拟页是之前分配的虚拟页吗?
②参考MiFindReservedAddressRegion函数、MiFreeAddressRegion函数和MiDecommitPages函数的定义和注释,说明这些函数的功能。
答①本次释放的虚拟地址是0xa000300,是之前分配的虚拟页;
②MiFindReservedAddressRegion函数用于查找已保留地址区域,如果目标区域非已保留区域则返回失败,MiFreeAddressRegion函数用于释放已保留地址区域和MiDecommitPages函数用于释放映射在连续虚拟页框上的物理页框。
3.源程序并附上注释
#include"
EOSApp.h"
//头文件
#defineN10000//定义等待时间10S=100000ms
INT*d;
intmain()//主函数
{
/*调用API函数VirtualAlloc分配一个整型变量所需的空间并使用一个整型变量的指针指向这个空间*/
if(d=VirtualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT))
{
printf("
Allocated%dbytesvirtualmemoryof0x%x\n"
sizeof(int),d);
\n"
);
/*修改整型变量的值为0xFFFFFFFF。
在修改前输出整型变量的值,在修改后再输出整型变的值*/
virtualmemoryoriginalvalue:
0x%x\n"
*d);
*d=0xFFFFFFFF;
virtualmemorynewvalue:
Waitfor10seconds"
Sleep(N);
/*调用API函数Sleep,等待10秒钟。
*/
if(VirtualFree(d,0,MEM_RELEASE))/*调用API函数VirtualFree,释放之前分配的整型变量的空间*/
{printf("
Realeasevirtualmemorysuccess!
"
}
else
{printf("
realeaseerror"
\nEndlessloop!
while
(1){};
/*进入死循环,这样应用程序就不会结束。
}
else{printf("
Error!
return0;
}
Success!
return1;
4.程序运行时的初值和运行结果
4.1准备实验
启动OSLab。
新建一个EOSKernel项目。
4.2阅读控制台命令“pm”相关的源代码,并查看其执行的结果
按照下面的步骤执行控制台命令“pm”,查看物理存储器的信息:
1.按F7生成在本实验3.1中创建的EOSKernel项目。
2.按F5启动调试。
3.待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。
4.3分配物理页和释放物理页接下来,在pm命令函数中添加分配物理页和释放物理页的代码,单步调试管理物理页的方法。
1.使用OSLab打开本实验文件夹中的pm.c文件。
2.使用pm.c文件中ConsoleCmdPhysicalMemory函数的函数体替换ke/sysproc.c文件中ConsoleCmdPhysicalMemory函数的函数体。
3.按F7生成修改后的EOSKernel项目。
4.按F5启动调试。
5.待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。
按照下面的步骤调试分配物理页和释放物理页的过程:
1.结束之前的调试。
2.在ke/sysproc.c文件的ConsoleCmdPhysicalMemory函数中,在调用MiAllocateAnyPages函数的代码行添加一个断点,在调用MiFreePages函数的代码行添加一个断点。
3.按F5启动调试。
4.待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。
5.pm命令开始执行后,会在调用MiAllocateAnyPages函数的代码行处中断,按F11调试进入MiAllocateAnyPages函数。
6.按F10单步调试MiAllocateAnyPages函数的执行过程。
继续调试释放物理页的过程:
1.按F5继续执行,会在调用MiFreePages函数的代码行处中断,按F11调试进入MiFreePages函数。
2.按F10单步调试MiFreePages函数的执行过程。
结束此次调试。
4.4阅读控制台命令“vm”相关的源代码,并查看其执行的结果
按照下面的步骤执行控制台命令“vm”,查看系统进程的虚拟地址描述符信息:
1.按F5启动调试。
2.待EOS启动完毕,在EOS控制台中输入命令“pt”后按回车。
“pt”命令可以输出当前系统中的进程列表,其中系统进程的ID为1。
3.在EOS控制台中输入命令“vm1”后按回车。
可以按照下面的步骤执行控制台命令“vm”,查看当创建了一个应用程序进程后,系统进程和应用程序进程中虚拟地址描述符的信息:
1.在“项目管理器”窗口中双击Floppy.img文件使用FloppyImageEditor工具打开此软盘镜像。
2.将本实验文件夹中的LoopApp.exe文件添加到软盘镜像的根目录中。
3.点击FloppyImageEditor工具栏上的保存按钮,关闭该工具。
5.待EOS启动完毕,在EOS控制台中输入命令“A:
\LoopApp.exe”后按回车。
此时就使用EOS应用程序文件LoopApp.exe创建了一个应用程序进程,由于此进程执行了一个死循环,所以此进程不会结束执行,除非关闭虚拟机。
6.此时按Ctrl+F2切换到“Console-2”,然后输入命令“pt”后按回车。
输出的信息如图所示。
其中ID为31的进程就是应用程序进程,ID为33的线程就是应用程序进程的主线程。
7.输入命令“vm1”后按回车,可以查看系统进程中虚拟地址描述符的信息。
8.输入命令“vm31”后按回车,可查看应用程序进程中虚拟地址描述符的信息。
为了加深对进程逻辑地址空间的理解,可以在控制台1至控制台7中都执行命令“A:
\LoopApp.exe”,从而让应用程序创建7个进程,然后在控制台8中执行“pt”、“vm”等命令,查看系统进程和应用程序进程的虚拟地址描述符。
4.5在系统进程中分配虚拟页和释放虚拟页
首先,按照下面的步骤修改vm命令的源代码:
1.使用OSLab打开本实验文件夹中的vm.c文件。
2.使用vm.c文件中ConsoleCmdVM函数的函数体替换ke/sysproc.c文件中ConsoleCmdVM函数的函数体。
5.待EOS启动完毕,在EOS控制台中输入命令“vm1”后按回车。
命令执行的结果会同时转储在“输出”窗口中,内容如图所示。
1.在ke/sysproc.c文件的ConsoleCmdVM函数中,在调用MmAllocateVirtualMemory函数的代码行添加一个断点,在调用MmFreeVirtualMemory函数的代码行添加一个断点。
3.待EOS启动完毕,在EOS控制台中输入命令“vm1”后按回车。
4.vm命令开始执行后,会在调用MmAllocateVirtualMemory函数的代码行处中断。
此时要注意参数BaseAddress和RegionSize初始化的值。
按F11调试进入MmAllocateVirtualMemory函数。
5.按F10单步调试MmAllocateVirtualMemory函数的执行过程,尝试回答下面的问题:
继续调试释放虚拟页的过程:
1.按F5继续执行,会在调用MmFreeVirtualMemory函数的代码行处中断。
按F11调试进入MmFreeVirtualMemory函数。
2.按F10单步调试MmFreeVirtualMemory函数的执行过程,尝试回答下面的问题:
1.尝试在调用MmAllocateVirtualMemory函数时将RegionSize参数的设置为PAGE_SIZE+1。
2.在调用MmAllocateVirtualMemory函数时将BaseAddress参数的值设置为已经被占用的虚拟内存0xA0000000,观察“输出”窗口中转储的信息。
3.尝试在调用MmAllocateVirtualMemory函数时将RegionSize参数的值设置为PAGE_SIZE*2,将BaseAddress参数的值设置为0xA0017004,观察“输出”窗口中转储的信息。
4.6在应用程序进程中分配虚拟页和释放虚拟页
4.6.1要求
创建一个EOS应用程序,并编写代码完成下列功能:
1.调用API函数VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。
2.修改整型变量的值为0xFFFFFFFF。
在修改前输出整型变量的值,在修改后再输出整型变量的值。
3.调用API函数Sleep,等待10秒钟。
4.调用API函数VirtualFree,释放之前分配的整型变量的空间。
5.进入死循环,这样应用程序就不会结束。
4.6.2测试方法
1.代码修改完毕后,按F7生成EOS应用程序项目。
2.按F5启动调试,应用程序自动执行后输出的结果可以参照图15-8所示。
3.在应用程序分配虚拟页后,利用10秒后才释放虚拟页的间隙,可以在控制台2中执行命令“vm31”,查看此时应用程序进程的虚拟地址描述符信息;
在应用程序释放虚拟页后,可以在控制台2中再次执行命令“vm31”,查看此时应用程序进程的虚拟地址描述符信息。
输出的结果可以参照图所示。
四、实验体会