操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx
- 文档编号:10658287
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:26
- 大小:590.04KB
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx
《操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx》由会员分享,可在线阅读,更多相关《操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx(26页珍藏版)》请在冰豆网上搜索。
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理
操作系统
实验报告
课程名称
操作系统实验
实验项目名称
物理存储器与进程逻辑地址空间的管理
学号
班级
20120616
姓名
专业
计算机科学与技术
学生所在学院
计算机科学
与技术学院
指导教师
初妍
实验室名称地点
21#428
哈尔滨工程大学
计算机科学与技术学院
一、实验概述
1.实验名称物理存储器与进程逻辑地址空间的管理
2.实验目的通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。
通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。
3.实验类型验证+设计
4.实验内容3.1准备实验
3.2阅读控制台命令“pm”相关的源代码,并查看其执行的结果
3.3分配物理页和释放物理页
3.4阅读控制台命令“vm”相关的源代码,并查看其执行的结果
3.5在系统进程中分配虚拟页和释放虚拟页
3.6在应用程序进程中分配虚拟页和释放虚拟页
3.6.1要求
3.6.2测试方法
3.6.3提示
二、实验环境
操作系统windosxp
编译器OSLab
语言c语言
三、实验过程
1.设计思路和流程图
MiAllocateAnyPages函数的流程图
MiFreePages函数的流程图
2.需要解决的问题及解答
(1)在实验指导的P160-4.和5.按F10单步调试MmAllocateVirtualMemory函数的执行过程,要求给出监视窗口BaseAddress和RegionSize个变量前后变化截图界面。
截图见3.5。
在实验指导的P160-1.和2.按F10单步调试MmFreeVirtualMemory函数的执行过程,要求给出监视窗口BaseAddress和RegionSize个变量前后变化截图界面。
截图见3.5。
(2)按照《实验指导》的P160-3.6在应用程序进程中分配虚拟页和释放虚拟页,编写代码。
要求至少给出源代码及其解释。
程序见3.6.2。
(3)按F10单步调试MiAllocateAnyPages函数的执行过程,尝试回答下面的问题:
①本次分配的物理页的数量是多少?
分配的物理页的页框号是多少?
②物理页是从空闲页链表中分配的?
还是从零页链表中分配的?
③哪一行语句减少了空闲页的数量?
哪一行语句将刚刚分配的物理页由空闲状态修改为忙状态?
答:
①本次分配的物理页的数量是1,分配的物理页的页框号是0x409;
②物理页是从空闲页链表中分配的
③第226行MiFreePageListHead=MiGetPfnDatabaseEntry(Pfn)->Next;和第227行MiFreePageCount--;减少了空闲页的数量,第229行将刚刚分配的物理页由空闲状态修改为忙状态;
(4)按F10单步调试MiFreePages函数的执行过程,尝试回答下面的问题:
①本次释放的物理页的数量是多少?
释放的物理页的页框号是多少?
释放的物理页是之前分配的物理页吗?
②释放的物理页是被放入了空闲页链表中?
还是零页链表中?
③绘制MiFreePages函数的流程图。
答:
①本次释放的物理页的数量是1,释放的物理页的页框号0x409,释放的物理页是之前分配的物理页;
②释放的物理页被放入了空闲页链表中;
③见实验过程开头流程图部分。
(5)按F10单步调试MmAllocateVirtualMemory函数的执行过程,尝试回答下面的问题:
①分配的虚拟页的起始地址是多少?
分配的虚拟页的数量是多少?
它们和参数BaseAddress和RegionSize初始化的值有什么样的关系?
②分配虚拟页的同时有为虚拟页映射实际的物理页吗?
这是由哪个参数决定的?
③分配的虚拟页是在系统地址空间(高2G)还是在用户地址空间(低2G)?
这是由哪个参数决定的?
④参考MiReserveAddressRegion函数的定义和注释,说明该函数的功能。
答:
①分配的虚拟页的起始地址是0xa0003000,分配的虚拟页的数量是1,BaseAddress和RegionSize初始化的值是期望保留或者提交的地址区域的起始地址和大小;
②分配虚拟页的同时有为虚拟页映射实际的物理页,这是由第三个参数AllocationType决定的;
③分配的虚拟页是在系统地址空间(高2G),这是由第四个参数SystemVirtual决定的;
④MiReserveAddressRegion函数的功能是保留一段虚拟地址区域。
(6)按F10单步调试MmFreeVirtualMemory函数的执行过程,尝试回答下面的问题:
①本次释放的虚拟地址是多少?
释放的虚拟页是之前分配的虚拟页吗?
②参考MiFindReservedAddressRegion函数、MiFreeAddressRegion函数和MiDecommitPages函数的定义和注释,说明这些函数的功能。
答:
①本次释放的虚拟地址是0xa0003000,是之前分配的虚拟页;
②MiFindReservedAddressRegion函数用于查找已保留地址区域,如果目标区域非已保留区域则返回失败,MiFreeAddressRegion函数用于释放已保留地址区域和MiDecommitPages函数用于释放映射在连续虚拟页框上的物理页框。
(7)在本实验
3.3中,如果分配了物理页后,没有回收,会对EOS操作系统造成什么样的影响?
目前EOS操作系统内核函数MiAllocateAnyPages能处理所有物理页被分配完毕的情况吗?
例如在没有可分配的物理页的情况下调用该内核函数,是否会返回失败?
如果内核函数MiAllocateAnyPages还不能处理这种极端情况,尝试修改代码解决这个问题。
答:
如果分配了物理页后,没有回收,将会使可分配自由页和零页越来越少,最终导致内存溢出,系统无法运行。
目前EOS操作系统内核函数MiAllocateAnyPages不能处理所有物理页被分配完毕的情况,在没有可分配的物理页的情况下,不会分配物理页,但仍然会返回成功,添加以下代码即可:
Else{return STATUS_MEMORY_NOT_ALLOCATED;}
(8)在本实验 3.3 中,在分配物理页时是调用的内核函数 MiAllocateAnyPages,该函数会优先分配空闲页,尝试修改代码,调用内核函数MiAllocateZeroedPages优先分配零页,并调试分配零页的情况。
尝试从性能的角 7 度分析内核函数 MiAllocateAnyPages 和 MiAllocateZeroedPages。
尝试从安全性的角度分析分配零页的必要性。
答:
将MiAllocateAnyPages(1, PfnArray);修改为MiAllocateZeroedPages(1, PfnArray);即可。
系统启动时,所有空闲物理页都是未初始化的,此时零页链表为空,MiAllocateAnyPages函数可以直接从自由页链表分配,而MiAllocateZeroedPages函数会对从自由页链表中分配的每一页进行零初始化,确保所有分配页都是被零初始化的,再进行分配,因此MiAllocateZeroedPages函数效率较低。
但因为MiAllocateZeroedPages函数对自由页进行了初始化,减小了出错的可能性,从而安全性较高。
3.主要数据结构、实现代码及其说明
typedef struct _MMPFN {
ULONG Unused :
9; // 未用
ULONG PageState :
3; // 物理页的状态
ULONG Next :
20; // 下一个物理页的页框号
}MMPFN, *PMMPFN;
typedef enum _PAGE_STATE {
ZEROED_PAGE, // 零页
FREE_PAGE, // 自由页
BUSY_PAGE, // 占用页
} PAGE_STATE;
// 虚拟地址描述符
typedef struct _MMVAD{
ULONG_PTR StartingVpn; // 被使用区域的开始虚页框号
ULONG_PTR EndVpn; // 被使用区域的结束虚页框号
LIST_ENTRY VadListEntry; // 链表项,用于将描述同一地址空间的所有VAD串//成链表
}MMVAD, *PMMVAD;
// 虚拟地址表
typedef struct _MMVAD_LIST{
ULONG_PTR StartingVpn; // 记录的进程地址空间的开始虚页号
ULONG_PTR EndVpn; // 记录的进程地址空间的结束虚页号
LIST_ENTRY VadListHead; // VAD链表头
}MMVAD_LIST, *PMMVAD_LIST;
4.程序运行时的初值和运行结果
3.1准备实验
1.启动OSLab。
2.新建一个EOSKernel项目。
3.2阅读控制台命令“pm”相关的源代码,并查看其执行的结果
执行控制台命令“pm”,查看物理存储器的信息:
3.3分配物理页和释放物理页
使用pm.c文件中ConsoleCmdPhysicalMemory函数的函数体替换ke/sysproc.c文件中ConsoleCmdPhysicalMemory函数的函数体。
调试并执行控制台命令“pm”,查看物理存储器的信息:
分配和释放多个物理页
调用MiAllocateAnyPages函数时分配多个物理页,然后在调用MiFreePages函数时将分配的多个物理页释放。
3.4阅读控制台命令“vm”相关的源代码,并查看其执行的结果
执行控制台命令“vm”,查看系统进程的虚拟地址描述符信息:
按F5启动调试。
待EOS启动完毕,在EOS控制台中输入命令“pt”后按回车。
“pt”命令可以输出当前系统中的进程列表,其中系统进程的ID为1。
在EOS控制台中输入命令“vm1”后按回车得到虚拟地址描述符信息。
执行控制台命令“vm”,查看当创建了一个应用程序进程后,系统进程和应用程
序进程中虚拟地址描述符的信息:
切换到“Console-2”,然后输入命令“pt”后按回车。
输出的信息:
输入命令“vm1”后按回车,可以查看系统进程中虚拟地址描述符的信息
输入命令“vm31”后按回车,可以查看应用程序进程中虚拟地址描述符的信息
3.5在系统进程中分配虚拟页和释放虚拟页
使用vm.c文件中ConsoleCmdVM函数的函数体替换ke/sysproc.c文件中ConsoleCmdVM函数的函数体。
在EOS控制台中输入命令“vm1”后按回车
调试分配虚拟页和释放虚拟页的过程:
vm命令开始执行后,会在调用MmAllocateVirtualMemory函数的代码行处中断。
此时要注意参数
BaseAddress和RegionSize初始化的值。
分配虚拟页的调试过程中BaseAddress和RegionSize的值的变化:
进入函数之前BaseAddress和RegionSize的值
退出函数以后BaseAddress和RegionSize的值
释放虚拟页的调试过程中BaseAddress和RegionSize的值的变化:
进入函数前BaseAddress和RegionSize的值
刚退出函数时BaseAddress和RegionSize的值
在调用MmAllocateVirtualMemory函数时将RegionSize参数的值设置为PAGE_SIZE+1时“输出”窗口中转储的信息:
TotalVpnfrom655360to657407.(0xA0000000-0xA07FFFFF)
1#VadInclude1VpnFrom655360to655360.(0xA0000000-0xA0000FFF)
2#VadInclude2VpnFrom655361to655362.(0xA0001000-0xA0002FFF)
3#VadInclude2VpnFrom655365to655366.(0xA0005000-0xA0006FFF)
4#VadInclude2VpnFrom655367to655368.(0xA0007000-0xA0008FFF)
5#VadInclude2VpnFrom655369to655370.(0xA0009000-0xA000AFFF)
6#VadInclude2VpnFrom655371to655372.(0xA000B000-0xA000CFFF)
7#VadInclude2VpnFrom655373to655374.(0xA000D000-0xA000EFFF)
8#VadInclude2VpnFrom655375to655376.(0xA000F000-0xA0010FFF)
9#VadInclude2VpnFrom655377to655378.(0xA0011000-0xA0012FFF)
10#VadInclude2VpnFrom655379to655380.(0xA0013000-0xA0014FFF)
11#VadInclude2VpnFrom655381to655382.(0xA0015000-0xA0016FFF)
TotalVpnCount:
2048.
AllocatedVpnCount:
21.
FreeVpnCount:
2027.
ZeroedPhysicalPageCount:
0.
FreePhysicalPageCount:
7126.
NewVM'sbaseaddress:
0xA0017000.Size:
0x3000.
1#VadInclude1VpnFrom655360to655360.(0xA0000000-0xA0000FFF)
2#VadInclude2VpnFrom655361to655362.(0xA0001000-0xA0002FFF)
3#VadInclude2VpnFrom655365to655366.(0xA0005000-0xA0006FFF)
4#VadInclude2VpnFrom655367to655368.(0xA0007000-0xA0008FFF)
5#VadInclude2VpnFrom655369to655370.(0xA0009000-0xA000AFFF)
6#VadInclude2VpnFrom655371to655372.(0xA000B000-0xA000CFFF)
7#VadInclude2VpnFrom655373to655374.(0xA000D000-0xA000EFFF)
8#VadInclude2VpnFrom655375to655376.(0xA000F000-0xA0010FFF)
9#VadInclude2VpnFrom655377to655378.(0xA0011000-0xA0012FFF)
10#VadInclude2VpnFrom655379to655380.(0xA0013000-0xA0014FFF)
11#VadInclude2VpnFrom655381to655382.(0xA0015000-0xA0016FFF)
12#VadInclude3VpnFrom655383to655385.(0xA0017000-0xA0019FFF)
AllocatedVpnCount:
24.
FreeVpnCount:
2024.
ZeroedPhysicalPageCount:
0.
FreePhysicalPageCount:
7126.
FreeVM'sbaseaddress:
0xA0017000.Size:
0x3000.
1#VadInclude1VpnFrom655360to655360.(0xA0000000-0xA0000FFF)
2#VadInclude2VpnFrom655361to655362.(0xA0001000-0xA0002FFF)
3#VadInclude2VpnFrom655365to655366.(0xA0005000-0xA0006FFF)
4#VadInclude2VpnFrom655367to655368.(0xA0007000-0xA0008FFF)
5#VadInclude2VpnFrom655369to655370.(0xA0009000-0xA000AFFF)
6#VadInclude2VpnFrom655371to655372.(0xA000B000-0xA000CFFF)
7#VadInclude2VpnFrom655373to655374.(0xA000D000-0xA000EFFF)
8#VadInclude2VpnFrom655375to655376.(0xA000F000-0xA0010FFF)
9#VadInclude2VpnFrom655377to655378.(0xA0011000-0xA0012FFF)
10#VadInclude2VpnFrom655379to655380.(0xA0013000-0xA0014FFF)
11#VadInclude2VpnFrom655381to655382.(0xA0015000-0xA0016FFF)
AllocatedVpnCount:
21.
FreeVpnCount:
2027.
ZeroedPhysicalPageCount:
0.
FreePhysicalPageCount:
7126.
在调用MmAllocateVirtualMemory函数时将BaseAddress参数的值设置为已经被占用的虚拟内存,例如0xA0000000,“输出”窗口中转储的信息:
TotalVpnfrom655360to657407.(0xA0000000-0xA07FFFFF)
1#VadInclude1VpnFrom655360to655360.(0xA0000000-0xA0000FFF)
2#VadInclude2VpnFrom655361to655362.(0xA0001000-0xA0002FFF)
3#VadInclude2VpnFrom655365to655366.(0xA0005000-0xA0006FFF)
4#VadInclude2VpnFrom655367to655368.(0xA0007000-0xA0008FFF)
5#VadInclude2VpnFrom655369to655370.(0xA0009000-0xA000AFFF)
6#VadInclude2VpnFrom655371to655372.(0xA000B000-0xA000CFFF)
7#VadInclude2VpnFrom655373to655374.(0xA000D000-0xA000EFFF)
8#VadInclude2VpnFrom655375to655376.(0xA000F000-0xA0010FFF)
9#VadInclude2VpnFrom655377to655378.(0xA0011000-0xA0012FFF)
10#VadInclude2VpnFrom655379to655380.(0xA0013000-0xA0014FFF)
11#VadInclude2VpnFrom655381to655382.(0xA0015000-0xA0016FFF)
TotalVpnCount:
2048.
FreeVpnCount:
2027.
ZeroedPhysicalPageCount:
0.
FreePhysicalPageCount:
7126.
NewVM'sbaseaddress:
0xA0003000.Size:
0x1000.
1#VadInclude1VpnFrom655360to655360.(0xA0000000-0xA0000FFF)
2#VadInclude2VpnFrom655361to655362.(0xA0001000-0xA0002FFF)
3#VadInclude1VpnFrom655363to655363.(0xA0003000-0xA0003FFF)
4#VadInclude2VpnFrom655365to655366.(0xA0005000-0xA0006FFF)
5#VadInclude2VpnFrom655367to655368.(0xA0007000-0xA0008FFF)
6#VadInclude2VpnFrom655369to655370.(0xA0009000-0xA000AFFF)
7#VadInclude2VpnFrom655371to655372.(0xA000B000-0xA000CFFF)
8#VadInclude2VpnFrom655373to655374.(0xA000D000-0xA000EFFF)
9#VadInclude2VpnFrom655375to655376.(0xA000F000-0xA0010FFF)
10#VadInclude2VpnFrom655377to655378.(0xA0011000-0xA0012FFF)
11#VadInclude2VpnFrom655379to655380.(0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 第四 物理 存储器 进程 逻辑 地址 空间 管理