第四讲 物理存储器与进程逻辑地址空间的管理.docx

上传人:b****6 文档编号:5774175 上传时间:2023-01-01 格式:DOCX 页数:11 大小:345.08KB
下载 相关 举报
第四讲 物理存储器与进程逻辑地址空间的管理.docx_第1页
第1页 / 共11页
第四讲 物理存储器与进程逻辑地址空间的管理.docx_第2页
第2页 / 共11页
第四讲 物理存储器与进程逻辑地址空间的管理.docx_第3页
第3页 / 共11页
第四讲 物理存储器与进程逻辑地址空间的管理.docx_第4页
第4页 / 共11页
第四讲 物理存储器与进程逻辑地址空间的管理.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

第四讲 物理存储器与进程逻辑地址空间的管理.docx

《第四讲 物理存储器与进程逻辑地址空间的管理.docx》由会员分享,可在线阅读,更多相关《第四讲 物理存储器与进程逻辑地址空间的管理.docx(11页珍藏版)》请在冰豆网上搜索。

第四讲 物理存储器与进程逻辑地址空间的管理.docx

第四讲物理存储器与进程逻辑地址空间的管理

操作系统

实验报告

课程名称

操作系统实验

课程编号

0906553

实验项目名称

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

学号

班级

姓名

专业

计算机科学与技术

学生所在学院

计算机科学与技术学院

指导教师

王红滨

实验室名称地点

21B475

哈尔滨工程大学

计算机科学与技术学院

一、实验概述

1.实验名称

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

2.实验目的

1)通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。

2)通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法

3.实验类型

验证+设计

4.实验内容

1)准备实验,创建一个EOSKernel项目;

2)阅读控制台命令“pm”相关的源代码,并查看其执行的结果;

3)分配物理页和释放物理页;

4)阅读控制台命令“vm”相关的源代码,并查看执行的结果;

5)在系统进程中分配虚拟页和释放虚拟页;

6)在应用程序进程中分配虚拟页和释放虚拟页。

二、实验环境

操作系统:

Windows操作系统

编译器:

集成开发环境OSLab

工具:

FloppyImageEditor工具

语言:

C语言

三、实验过程

1.设计思路和流程图

MiAllocateAny函数流程图:

MiFreePages函数流程图:

2.需要解决的问题及解答

1)在调试分配物理页过程中的问题:

本次分配的物理页的数量是多少?

分配的物理页的页框号是多少?

答:

因NumberOfPages为0x1,所以分配的物理页数量为1,分配的物理页的页框号是0x409;

物理页是从空闲页链表中分配的?

还是从零页链表中分配的?

答:

物理页是从空闲页链表中分配

哪一行语句减少了空闲页的数量?

哪一行语句将刚刚分配的物理页由空闲状态修改为忙状态?

答:

MiFreePageListHead=MiGetPfnDatabaseEntry(Pfn)->Next;和MiFreePageCount--;减少了空闲页的数量,152行将分配的物理页改为BUSY_PAGE

2)在调试释放物理页的过程中的问题:

本次释放的物理页的数量是多少?

释放的物理页的页框号是多少?

释放的物理页是之前分配的物理页吗?

答:

因为NumberOfPages为0x1,所以释放的物理页数量为1,释放的物理页框号是0x409,所有释放的物理页是之前分配的物理页;

释放的物理页是被放入了空闲页链表中?

还是零页链表中?

答:

释放的物理页被放在放在空闲页链表

3)按F10单步调试MmAllocateVirtualMemory函数的执行过程,尝试回答下面的问题:

分配的虚拟页的起始地址是多少?

分配的虚拟页的数量是多少?

它们和参数BaseAddress和RegionSize初始化的值有什么样的关系?

答:

分配的虚拟页的起始地址是0xa0003000,分配的虚拟页的数量是1,BaseAddress和RegionSize初始化的值是期望保留或者提交的地址区域的起始地址和大小。

分配虚拟页的同时有为虚拟页映射实际的物理页吗?

这是由哪个参数决定的?

答:

分配虚拟页的同时有为虚拟页映射实际的物理页,这是由第三个参数AllocationType决定的。

分配的虚拟页是在系统地址空间(高2G)还是在用户地址空间(低2G)?

这是由哪个参数决定的?

答:

分配的虚拟页是在系统地址空间(高2G),这是由第四参数SystemVirtual决定的。

参考MiReserveAddressRegion函数的定义和注释,说明该函数的功能。

答:

MiReserveAddressRegion函数的功能是保留一段虚拟地址区域。

4)按F10单步调试MmFreeVirtualMemory函数的执行过程,尝试回答下面的问题:

本次释放的虚拟地址是多少?

释放的虚拟页是之前分配的虚拟页吗?

答:

本次释放的虚拟地址是0xa0003000,是之前分配的虚拟页。

参考MiFindReservedAddressRegion函数、MiFreeAddressRegion函数和MiDecommitPages函数的定义和注释,说明这些函数的功能。

答:

MiFindReservedAddressRegion函数用于查找已保留地址区域,如果目标区域非已保留区域则返回失败,MiFreeAddressRegion函数用于释放已保留地址区域和MiDecommitPages函数用于释放映射在连续虚拟页框上的物理页框。

3.源程序并附上注释

在应用程序中分配虚拟页和释放虚拟页:

intmain(intargc,char*argv[])

{

#ifdef_debug

__asm("int$3\nnop");

#endif

int*data;

if(data=VirtuAlalloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT)){

//修改前输出*data

printf("Allocated%dbytesvirtualmemoryof0x%x\n\n",sizeof(int),data);

printf("Virtualmemoryoriginalvalue:

0x%x\n\n",*data);

//为*data赋值,并输出修改后的值

*data=0xffffffff;

printf("Virtualmemorynewvalue:

0x%x\n\n",*d);

//等待10秒

printf("\nWaitfor10seconds\n");

Sleep(10000);

//释放为data分配的空间

if(VirtualFree(data,0,MEM_RELEASE)){

printf("\nRealeasevirtualmemorysuccess!

\n");

//进入死循环

printf("\nEndlessloop!

");

for(;;);

}else{

printf("Realeasevirtualmemoryerror\n");

}

}else{

printf("VirtuAlallocerror\n");

return-1;

}

return0;

}

4.程序运行时的初值和运行结果

1)准备实验,创建一个EOSKernel项目

2)阅读控制台命令“pm”相关的源代码,并查看其执行的结果

生成在本实验创建的EOSKernel项目。

待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。

观察命令执行的结果。

3)分配物理页和释放物理页

接下来,在pm命令函数中添加分配物理页和释放物理页的代码,单步调试管理物理页的方法。

使用pm.c文件中的ConsoleCmdPhysicalMemory函数代替ke/sysproc.c文件中的ConsoleCmdPhysicalMemory函数的函数体,生成修改后的EOSKernel项目,启动调试,在EOS控制台中输入命令“pm”查看执行结果。

结束之前的调试,在ConsoleCmdPhysicalMemory函数中调用MiAllocateAnyPages函数的代码行添加断点,在调用MiFreePages函数的代码行添加断点。

启动调试,在控制台中输入命令“pm”后回车,pm开始执行后,会在调用MiAllocateAnyPages中断,按F11调试进入此函数,单步调试执行过程。

继续调试释放物理页的过程,单步调试MiFreePages函数的执行过程。

4)阅读控制台命令“vm”相关的源代码,并查看执行的结果

启动调试,在EOS控制台中输入命令“pt”以输出当前系统中的进程列表,系统进程ID为1。

在控制台中输入“vm”并观察执行结果,了解系统进程的虚拟地址描述符信息。

有LoopApp.c生成LoopApp.exe,添加到软盘镜像的根目录,启动调试,在控制台中执行LoopApp.exe。

切换到“Console-2”,运行pt查看进程信息。

输入命令“vm1”,查看系统进程中虚拟地址描述符信息。

输入命令“vm31”,查看应用程序进程中虚拟地址描述符的信息。

5)在系统进程中分配虚拟页和释放虚拟页

使用vm.c文件中的ConsoleCmdVM函数代替ke/sysproc.c文件中的ConsoleCmdVM函数,生成EOSKernel项目,启动调试,输入命令“vm1”,命令的执行结果同时会转储在“输出”窗口。

在ke/sysproc.c文件中的ConsoleCmdVM函数中调用MmAllocateVirtualMemory函数和调用MmFreeVirtualMemory函数的代码行添加断点,启动调试,在控制台输入命令“vm1”,在MmAllocateVirtualMemory函数出中断,查看BaseAddress和RegionSize的初始值。

离开MmAlocateVirtualMemory函数后

继续调试释放虚拟页的过程,进入MmFreeVirtualMemory函数前

离开MmFreeVirtualMemory函数后

6)在应用程序进程中分配虚拟页和释放虚拟页

创建一个EOS应用程序,编写代码完成下列功能:

A.调用API函数VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。

B.修改整型变量的值为0xFFFFFFFF。

在修改前输出整型变量的值,在修改后再输出整型变量的值。

C.调用API函数Sleep,等待10秒钟。

D.调用API函数VirtualFree,释放之前分配的整型变量的空间。

E.进入死循环,这样应用程序就不会结束。

代码修改完毕后,生成EOS应用程序项目,执行应用程序。

利用10秒后才释放虚拟页的间隙,在控制台2中执行命令“vm31”,查看此时应用程序进程的虚拟地址描述符信息,在应用程序释放虚拟页后,在控制台2中再次执行命令“vm31”查看此时应用程序进程的虚拟地址描述符信息。

四、实验体会

在这次的实验过程中,我通过查看物理存储器的使用情况,并调试EOS的分配和回收物理内存的过程,掌握了物理存储器的管理方法;通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,掌握了进程逻辑地址空间的管理方法。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1