操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx

上传人:b****4 文档编号:5328433 上传时间:2023-05-08 格式:DOCX 页数:26 大小:590.04KB
下载 相关 举报
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第1页
第1页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第2页
第2页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第3页
第3页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第4页
第4页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第5页
第5页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第6页
第6页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第7页
第7页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第8页
第8页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第9页
第9页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第10页
第10页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第11页
第11页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第12页
第12页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第13页
第13页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第14页
第14页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第15页
第15页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第16页
第16页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第17页
第17页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第18页
第18页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第19页
第19页 / 共26页
操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx

《操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx》由会员分享,可在线阅读,更多相关《操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx(26页珍藏版)》请在冰点文库上搜索。

操作系统实验第四讲物理存储器与进程逻辑地址空间的管理.docx

操作系统实验第四讲物理存储器与进程逻辑地址空间的管理

操作系统

实验报告

课程名称

操作系统实验

实验项目名称

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

学号

班级

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

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

当前位置:首页 > 工程科技 > 材料科学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2