07物理存储器与进程逻辑地址空
间的管理(共21页)
-本页仅作为预览文档封面,使用时请删除本页-
《操作系统》实验报告
实验题目 物理存储器与进程逻辑地址 空间的管理 学生姓名 lee 学 号 专业班级 指导教师 院系名称 计算机与信息学院 2017 年 10 月 30 日 2
实验7 物理存储器与进程逻辑地址空间的
管理
1. 实验目的与要求
通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。
通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。
2. 实验原理
阅读本书第6章。重点阅读第节和第节,了解物理存储器的管理方式和进程
逻辑地址空间的管理方式。
3. 实验内容
准备实验
按照下面的步骤准备实验: 1. 启动OS Lab。
2. 新建一个EOS Kernel项目。
阅读控制台命令“pm”相关的源代码,并查看其执行的结果
阅读ke/文件中第1059行的ConsoleCmdPhysicalMemory函数,学习“pm”命令是如何统计并输出物理存储器信息的。在阅读的过程中需要注意下面几点:
在统计输出物理存储器信息之前要关闭中断,之后要打开中断,这样可以防止在命令执行的过程中有其它线程分配或者释放物理页。
全局变量MiTotalPageFrameCount保存了物理页的总数。每个物理页的大小是4KB,由宏PAGE_SIZE定义。
全局变量MiZeroedPageCount和MiFreePageCount分别保存了零页和空闲页的数量。 计算已用物理页数量的方法是:物理页总数减去零页数量,再减去空闲页数量。
按照下面的步骤执行控制台命令“pm”,查看物理存储器的信息: 1. 按F7生成在本实验中创建的EOS Kernel项目。 2. 按F5启动调试。
3. 待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。
观察命令执行的结果,如图1所示,可以了解当前物理存储器的使用情况。
3
图1:“pm”命令的执行结果
分配物理页和释放物理页
接下来,在pm命令函数中添加分配物理页和释放物理页的代码,单步调试管理物理页的方法。按照下面的步骤修改pm命令的源代码:
1. 使用OS Lab打开本实验文件夹中的文件(将文件拖动到OS Lab窗口中释放即可打开)。此文件中有一个修改后的ConsoleCmdPhysicalMemory函数,主要是在原有代码的后面增加了分配物理页和释放物理页的代码。 2. 使用文件中ConsoleCmdPhysicalMemory函数的函数体替换ke/文件中ConsoleCmdPhysicalMemory函数的函数体。 3. 按F7生成修改后的EOS Kernel项目。 4. 按F5启动调试。
5. 待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。
观察命令执行的结果,如图2所示,尝试说明分配物理页或者释放物理页后物理存储器的变化情况。
4
图2:分配物理页或者释放物理页后物理存储器的变化情况。
按照下面的步骤调试分配物理页和释放物理页的过程: 1. 结束之前的调试。
2. 在ke/文件的ConsoleCmdPhysicalMemory函数中,在调用MiAllocateAnyPages函数的代码行(第1103行)添加一个断点,在调用MiFreePages函数的代码行(第1115行)添加一个断点。
3. 按F5启动调试。
4. 待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。
5. pm命令开始执行后,会在调用MiAllocateAnyPages函数的代码行处中断,按F11调试进入MiAllocateAnyPages函数。
6. 按F10单步调试MiAllocateAnyPages函数的执行过程,尝试回答下面的问题: (1) 本次分配的物理页的数量是多少分配的物理页的页框号是多少 (2) 物理页是从空闲页链表中分配的还是从零页链表中分配的
(3) 哪一行语句减少了空闲页的数量哪一行语句将刚刚分配的物理页由空闲状态修改为忙状态
(4) 绘制MiAllocateAnyPages函数的流程图。
答:(1)本次分配的物理页的数量是1,分配的物理页的页框号是0x409;( 2) 物理页是从空闲页链表中分配的,;
5
(3)第226行MiFreePageListHead = MiGetPfnDatabaseEntry(Pfn)->Next;和第227行
MiFreePageCount--;减少了空闲页的数量,第229行将刚刚分配的物理页由空闲状态修改为忙状态; (4)
MiAllocateAnyPages函数的流程图
图3 MiAllocateAnyPages函数监视和堆栈
继续调试释放物理页的过程:
1. 按F5继续执行,会在调用MiFreePages函数的代码行处中断,按F11调试进入MiFreePages函数。
2. 按F10单步调试MiFreePages函数的执行过程,尝试回答下面的问题:
(1) 本次释放的物理页的数量是多少释放的物理页的页框号是多少释放的物理页是之前分配的物理页吗
(2) 释放的物理页是被放入了空闲页链表中还是零页链表中 (3) 绘制MiFreePages函数的流程图。
答:(1)本次释放的物理页的数量是1,释放的物理页的页框号0x409,释放 的物理页是之前分配的物理页;
6
(2)释放的物理页被放入了空闲页链表中; (3)见下图:
MiFreePages函数的流程图
图4 MiFreePages函数监视和堆栈
(问题:两次一加一减)
结束此次调试。继续修改pm命令的源代码,尝试在调用MiAllocateAnyPages函数时分配多个物理页,然后在调用MiFreePages函数时将分配的多个物理页释放,并练习调试这两个函数在分配多个物理页和释放多个物理页时执行的过程。
阅读控制台命令“vm”相关的源代码,并查看其执行的结果
阅读ke/文件中第959行的ConsoleCmdVM函数,学习“vm”命令是如何统计并输出进程的虚拟地址描述符信息的。在阅读的过程中需要注意下面几点:
与“pm”命令输出的是整个系统的物理存储器的使用情况不同,“vm”命令输出的是某个进程的虚拟地址描述符信息,所以“vm”命令使用了一个参数——进程ID,用来指定一个进程。这个进程既可以是系统进程,也可以是用户进程。
在统计输出指定进程的虚拟地址描述符信息之前要关闭中断,之后要打开中断,这样
7
可以防止在命令执行的过程中有其它线程分配或者释放虚拟页。
EOS操作系统的进程有4G的虚拟地址空间,但并不是所有的虚拟地址空间都使用虚拟地址描述符来管理,有一些地址空间是静态的,还有一些地址空间由其他的动态方式来管理(例如系统内存池)。
进程4G虚拟地址空间中由虚拟地址描述符所管理空间的低地址和高地址是固定的,在这段地址空间中,如果有虚拟页被占用,就会使用虚拟地址描述符来标识,并放入链表中管理。
按照下面的步骤执行控制台命令”vm”,查看系统进程的虚拟地址描述符信息: 1. 按F5启动调试。
2. 待EOS启动完毕,在EOS控制台中输入命令”pt”后按回车。”pt”命令可以输出当前系统中的进程列表,其中系统进程的ID为1。
图5 输入命令”pt”
3. 在EOS控制台中输入命令“vm 1”后按回车。
观察命令执行的结果,如图15-3所示,可以了解系统进程的虚拟地址描述符信息。
8
图6:使用“vm”命令查看系统进程虚拟地址描述符的结果
系统进程中由虚拟地址描述符所管理的虚拟页只会分配给进程的句柄表(句柄表占用一个虚拟页)和线程的堆栈(堆栈占用两个虚拟页)。结合之前“pt”命令输出的进程和线程信息可知,当前系统中只有1个系统进程以及10个系统线程,所以在图15-3中,1号描述符所包含的一个虚拟页即为系统进程的句柄表,而2到11号这10个描述符所分别包含的两个虚拟页即为10个系统线程的堆栈。
可以按照下面的步骤执行控制台命令“vm”,查看当创建了一个应用程序进程后,系统进程和应用程序进程中虚拟地址描述符的信息:
1. 在“项目管理器”窗口中双击文件,使用FloppyImageEditor工具打开此软盘镜像。 2. 将本实验文件夹中的文件添加到软盘镜像的根目录中(将文件拖动到
FloppyImageEditor窗口中释放即可)。EOS应用程序的源代码可以参考本实验文件夹中的文件。
3. 点击FloppyImageEditor工具栏上的保存按钮,关闭该工具。 4. 按F5启动调试。
5. 待EOS启动完毕,在EOS控制台中输入命令“A:\\”后按回车。此时就使用EOS应用程序文件创建了一个应用程序进程,由于此进程执行了一个死循环,所以此进程不会结束执行,除非关闭虚拟机。
6. 此时按Ctrl+F2切换到“Console-2”,然后输入命令“pt”后按回车。输出的信息如图15-4所示。其中ID为31的进程就是应用程序进程,ID为33的线程就是应用程序进程的主线
9
程。
7. 输入命令“vm 1”后按回车,可以查看系统进程中虚拟地址描述符的信息。输出的信息如图6所示。与图15-3比较可知,3号描述符所包含的一个虚拟页即为应用程序进程的句柄表,13号描述符所包含的两个虚拟页即为应用程序进程主线程的堆栈。
8. 输入命令“vm 31”后按回车,可以查看应用程序进程中虚拟地址描述符的信息。输出的信息如图7所示。
图7:使用pt命令查看有应用程序运行时进程和线程的信息。
10
图8:创建了一个应用程序进程后,系统进程中虚拟地址描述符的信息。
图9:使用“vm”命令查看应用程序进程虚拟地址描述符的结果。
在进程的4G逻辑地址空间中,应用程序进程可以自行管理低2G的用户空间。从图15-6中的信息可以得知,低2G的用户空间又被分为了三部分:
0x00000000-0x0000FFFF 由16个虚拟页构成的KB静态空间,用于捕捉对空指针的非法访问。
0x00010000-0x7FFEFFFF 由虚拟地址描述符管理的动态空间,用于存储应用程序进程的代码和数据。图15-6显示应用程序进程的代码和数据占用了此空间中的5个虚拟页,并且是用从应用程序的基址0x00400000起始的。
11
0x7FFF0000-0x7FFFFFFF由16个虚拟页构成的KB静态空间,用于捕捉对空指针的非法访问。
为了加深对进程逻辑地址空间的理解,可以在控制台1至控制台7中都执行命令”A:\\”,从而让应用程序创建7个进程,然后在控制台8中执行”pt”、”vm”等命令,查看系统进程和应用程序进程的虚拟地址描述符。
在系统进程中分配虚拟页和释放虚拟页
接下来,在vm命令函数中添加分配虚拟页和释放虚拟页的代码,单步调试管理虚拟页的方法。首先,按照下面的步骤修改vm命令的源代码:
1. 使用OS Lab打开本实验文件夹中的文件(将文件拖动到OS Lab窗口中释放即可打开)。此文件中有一个修改后的ConsoleCmdVM函数,主要是在原有代码的后面增加了分配虚拟页和释放物理页的代码。
2. 使用文件中ConsoleCmdVM函数的函数体替换ke/文件中ConsoleCmdVM函数的函数体。 3. 按F7生成修改后的EOS Kernel项目。 4. 按F5启动调试。
5. 待EOS启动完毕,在EOS控制台中输入命令“vm 1”后按回车。
命令执行的结果会同时转储在“输出”窗口中,内容如图15-7所示。尝试说明分配虚拟页或者释放虚拟页后虚拟地址描述符以及物理存储器的变化情况。
12
图10 命令执行情况
Total Vpn from 655360 to 657407. (0xA0000000 - 0xA07FFFFF)
1# Vad Include 1 Vpn From 655360 to 655360. (0xA0000000 - 0xA0000FFF) 2# Vad Include 2 Vpn From 655361 to 655362. (0xA0001000 - 0xA0002FFF) 3# Vad Include 2 Vpn From 655365 to 655366. (0xA0005000 - 0xA0006FFF) 4# Vad Include 2 Vpn From 655367 to 655368. (0xA0007000 - 0xA0008FFF) 5# Vad Include 2 Vpn From 655369 to 655370. (0xA0009000 - 0xA000AFFF) 6# Vad Include 2 Vpn From 655371 to 655372. (0xA000B000 - 0xA000CFFF) 7# Vad Include 2 Vpn From 655373 to 655374. (0xA000D000 - 0xA000EFFF) 8# Vad Include 2 Vpn From 655375 to 655376. (0xA000F000 - 0xA0010FFF) 9# Vad Include 2 Vpn From 655377 to 655378. (0xA0011000 - 0xA0012FFF) 10# Vad Include 2 Vpn From 655379 to 655380. (0xA0013000 - 0xA0014FFF) 11# Vad Include 2 Vpn From 655381 to 655382. (0xA0015000 - 0xA0016FFF) Total Vpn Count: 2048. Allocated Vpn Count: 21. Free Vpn Count: 2027.
Zeroed Physical Page Count: 0. Free Physical Page Count: 7126.
New VM's base address: 0xA0003000. Size: 0x1000.
1# Vad Include 1 Vpn From 655360 to 655360. (0xA0000000 - 0xA0000FFF) 2# Vad Include 2 Vpn From 655361 to 655362. (0xA0001000 - 0xA0002FFF) 3# Vad Include 1 Vpn From 655363 to 655363. (0xA0003000 - 0xA0003FFF) 4# Vad Include 2 Vpn From 655365 to 655366. (0xA0005000 - 0xA0006FFF) 5# Vad Include 2 Vpn From 655367 to 655368. (0xA0007000 - 0xA0008FFF) 6# Vad Include 2 Vpn From 655369 to 655370. (0xA0009000 - 0xA000AFFF) 7# Vad Include 2 Vpn From 655371 to 655372. (0xA000B000 - 0xA000CFFF) 8# Vad Include 2 Vpn From 655373 to 655374. (0xA000D000 - 0xA000EFFF) 9# Vad Include 2 Vpn From 655375 to 655376. (0xA000F000 - 0xA0010FFF) 10# Vad Include 2 Vpn From 655377 to 655378. (0xA0011000 - 0xA0012FFF) 11# Vad Include 2 Vpn From 655379 to 655380. (0xA0013000 - 0xA0014FFF) 12# Vad Include 2 Vpn From 655381 to 655382. (0xA0015000 - 0xA0016FFF) Allocated Vpn Count: 22. Free Vpn Count: 2026.
Zeroed Physical Page Count: 0. Free Physical Page Count: 7126.
Free VM's base address: 0xA0003000. Size: 0x1000.
1# Vad Include 1 Vpn From 655360 to 655360. (0xA0000000 - 0xA0000FFF) 2# Vad Include 2 Vpn From 655361 to 655362. (0xA0001000 - 0xA0002FFF) 3# Vad Include 2 Vpn From 655365 to 655366. (0xA0005000 - 0xA0006FFF) 4# Vad Include 2 Vpn From 655367 to 655368. (0xA0007000 - 0xA0008FFF) 5# Vad Include 2 Vpn From 655369 to 655370. (0xA0009000 - 0xA000AFFF) 6# Vad Include 2 Vpn From 655371 to 655372. (0xA000B000 - 0xA000CFFF) 7# Vad Include 2 Vpn From 655373 to 655374. (0xA000D000 - 0xA000EFFF)
13
8# Vad Include 2 Vpn From 655375 to 655376. (0xA000F000 - 0xA0010FFF) 9# Vad Include 2 Vpn From 655377 to 655378. (0xA0011000 - 0xA0012FFF) 10# Vad Include 2 Vpn From 655379 to 655380. (0xA0013000 - 0xA0014FFF) 11# Vad Include 2 Vpn From 655381 to 655382. (0xA0015000 - 0xA0016FFF) Allocated Vpn Count: 21. Free Vpn Count: 2027.
Zeroed Physical Page Count: 0. Free Physical Page Count: 7126.
图15-7:分配虚拟页或者释放虚拟页后虚拟地址描述符及物理存储器的变化情况。
1. 在ke/文件的ConsoleCmdVM函数中,在调用MmAllocateVirtualMemory函数的代码行(第1082行)添加一个断点,在调用MmFreeVirtualMemory函数的代码行(第1147行)添加一个断点。
2. 按F5启动调试。
3. 待EOS启动完毕,在EOS控制台中输入命令“vm 1”后按回车。
图11 输入命令“vm 1”
4. vm命令开始执行后,会在调用MmAllocateVirtualMemory函数的代码行处中断。此时要注意参数BaseAddress和RegionSize初始化的值。按F11调试进入MmAllocateVirtualMemory
14
函数。
图11 进入MmAllocateVirtualMemory函数前
进入函数后:
图12 进入MmAllocateVirtualMemory函数后
5. 按F10单步调试MmAllocateVirtualMemory函数的执行过程,尝试回答下面的问题: (1) 分配的虚拟页的起始地址是多少分配的虚拟页的数量是多少它们和参数BaseAddress和RegionSize初始化的值有什么样的关系?
(2) 分配虚拟页的同时有为虚拟页映射实际的物理页吗这是由哪个参数决定的 (3) 分配的虚拟页是在系统地址空间(高2G)还是在用户地址空间(低2G)这是由哪个参数决定的
(4) 参考MiReserveAddressRegion函数的定义和注释,说明该函数的功能。 继续调试释放虚拟页的过程:
答:(1)分配的虚拟页的起始地址是0xa0003000,分配的虚拟页的数量是1,BaseAddress和RegionSize初始化的值是期望保留或者提交的地址区域的起始地址和大小;
15
(2)分配虚拟页的同时有为虚拟页映射实际的物理页,这是由第三个参数AllocationType决定的;
(3)分配的虚拟页是在系统地址空间(高2G),这是由第四个参数SystemVirtual决定的;(4)MiReserveAddressRegion函数的功能是保留一段虚拟地址区域。
1. 按F5继续执行,会在调用MmFreeVirtualMemory函数的代码行处中断。此时要注意参数BaseAddress和RegionSize初始化的值。按F11调试进入MmFreeVirtualMemory函数。
图13 进入MmFreeVirtualMemory函数
16
图14 进入MmFreeVirtualMemory函数后
2. 按F10单步调试MmFreeVirtualMemory函数的执行过程,尝试回答下面的问题: (1) 本次释放的虚拟地址是多少释放的虚拟页是之前分配的虚拟页吗
(2) 参考MiFindReservedAddressRegion函数、MiFreeAddressRegion函数和MiDecommitPages函数的定义和注释,说明这些函数的功能。
答:(1)本次释放的虚拟地址是0xa0003000,是之前分配的虚拟页;
(2) MiFindReservedAddressRegion函数用于查找已保留地址区域,如果目标区域非已保留区域则返回失败,MiFreeAddressRegion函数用于释放已保留地址区域和MiDecommitPages函数用于释放映射在连续虚拟页框上的物理页框。
结束此次调试后,继续按照下列要求修改ConsoleCmdVM函数的源代码,加深对虚拟页分配和释放过程的理解:
1. 尝试在调用MmAllocateVirtualMemory函数时将RegionSize参数的值设置为PAGE_SIZE+1或者PAGE_SIZE*2+1。观察“输出”窗口中转储的信息,并说明申请虚拟内存的大小与实际分配的大小之间的关系,以及分配的虚拟内存大小会对分配的虚拟地址产生什么样的影响。将“输出”窗口中转储的信息保存在文本文件中。 (见
2. 尝试在调用MmAllocateVirtualMemory函数时将BaseAddress参数的值设置为已经被占用的虚拟内存,例如0xA0000000,观察“输出”窗口中转储的信息。将“输出”窗口中转储的信息保存在文本文件中。 见
3. 尝试在调用MmAllocateVirtualMemory函数时将RegionSize参数的值设置为
PAGE_SIZE*2,将BaseAddress参数的值设置为0xA0017004,观察“输出”窗口中转储的信息,并说明申请虚拟内存的大小与实际分配的大小之间的关系,以及申请的虚拟地址会对分配的虚拟内存大小产生什么样的影响。将“输出”窗口中转储的信息保存在文本文件中。 见
17
在应用程序进程中分配虚拟页和释放虚拟页 要求
创建一个EOS应用程序,并编写代码完成下列功能:
1. 调用API函数VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。
2. 修改整型变量的值为0xFFFFFFFF。在修改前输出整型变量的值,在修改后再输出整型变量的值。
3. 调用API函数Sleep,等待10秒钟。
4. 调用API函数VirtualFree,释放之前分配的整型变量的空间。 5. 进入死循环,这样应用程序就不会结束。 测试方法
1. 代码修改完毕后,按F7生成EOS应用程序项目。
2. 按F5启动调试,应用程序自动执行后输出的结果可以参照图15所示。
3. 在应用程序分配虚拟页后,利用10秒后才释放虚拟页的间隙,可以在控制台2中执行命令“vm 31”,查看此时应用程序进程的虚拟地址描述符信息;在应用程序释放虚拟页后,可以在控制台2中再次执行命令“vm 31”,查看此时应用程序进程的虚拟地址描述符信息。输出的结果可以参照图15-9所示。
图15:在应用程序进程中分配虚拟页和释放虚拟页
18
图16:分配虚拟页后和释放虚拟页
图17:分配虚拟页后和释放虚拟页后,应用程序进程的虚拟地址描述符信息
提示
1. API函数VirtualAlloc定义在api/文件的第48行。此API函数主要调用了EOS内核函数MmAllocateVirtualMemory。在EOS应用程序中调用函数VirtualAlloc时,除了使用MEM_RESERVE标志外,还必须使用MEM_COMMIT标志。
2. API函数VirtualFree定义在api/文件的第70行。此API函数主要调用了EOS内核函数
19
MmFreeVirtualMemory。在EOS应用程序中调用函数VirtualFree时,要使用MEM_RELEASE标 志。
3. 可以参考本实验文件中的文件,在应用程序的最后执行一个死循环。
4. 思考与练习
1. 在本实验中,如果分配了物理页后,没有回收,会对EOS操作系统造成什么样的影响?
目前EOS操作系统内核函数MiAllocateAnyPages能处理所有物理页被分配完毕的情况吗例如在没有可分配的物理页的情况下调用该内核函数,是否会返回失败如果内核函数MiAllocateAnyPages还不能处理这种极端情况,尝试修改代码解决这个问题。
答:如果分配了物理页后没有回收,EOS 操作系统将不能再使用未回收的物理页,如果分配的物理页都没有进行回收可能会造成EOS没有可用的物理页,从而导致EOS停止运行。目前EOS操作系统内核函数MiAllocateAnyPages还没有处理没有物理页可分配的情况。如果分配了物理页后,没有回收,将会使可分配自由页和零页越来越少,最终导致内存溢出,系统无法运行。目前 EOS操作系统内核函数 MiAllocateAnyPages 不能处理所有物理页被分配完毕的情况,在没有可分配的物理页的情况下,不会分配物理页,但仍然会返回成功,添加以下代码即可: Else{ return STATUS_MEMORY_NOT_ALLOCATED; }
2. 在本实验中,在分配物理页时是调用的内核函数MiAllocateAnyPages,该函数会优先
分配空闲页,尝试修改代码,调用内核函数MiAllocateZeroedPages优先分配零页,并调试分配零页的情况。尝试从性能的角度分析内核函数MiAllocateAnyPages和MiAllocateZeroedPages。尝试从安全性的角度分析分配零页的必要性。
答:从性能的角度来分析,调用MIAllocateAnyPages函数分配物理页在某些情况下比调用MIAllocateZeroedPages.函数要快速。 从安全行的角度来分析,分配零页更加安全。例如,一个物理页被操作系统存储过重要 的密码信息后被释放,如果没有清零就被分配给用户程序,则用户程序就可能从这个物理页中获得重要的密码信息。 将MiAllocateAnyPages(1, PfnArray);修改为MiAllocateZeroedPages(1,
PfnArray);即可。系统启动时,所有空闲物理页都是未初始化的,此时零页链表为空,MiAllocateAnyPages函数可以直接从自由页链表分配,而MiAllocateZeroedPages函数会对从自由页链表中分配的每一页进行零初始化,确保所有分配页都是被零初始化的,再进行分配,因此MiAllocateZeroedPages函数效率较低。但因为
MiAllocateZeroedPages函数对自由页进行了初始化,减小了出错的可能性,从而安全性较高。
3. 观察本实验中使用“vm”命令输出的系统进程的虚拟地址描述符(图15-3),可以看
到在2号描述符和3号描述符之间有两个虚拟页的空隙,尝试结合虚拟页的分配和释放说明产生这个空隙的原因。
答:产生的空隙是由于有虚拟页被释放造成的,在EOS启动时有一个初始化线程在初始化完毕后就退出了,线程的堆栈所占用的虚拟页就被释放了。
4. 在系统进程和应用程序进程的逻辑地址空间中,都有一部分空间由虚拟地址描述符来动态管理,尝试从管理方式、位置、大小、用途等方面说明这两部分空间的相同点和不同点。
5. 在本实验中,调用MmAllocateVirtualMemory函数分配虚拟页时只使用了MEM_RESERVE标志,没有使用MEM_COMMIT标志,尝试说明这两个标志的区别。修改代码,在调用
20
MmAllocateVirtualMemory函数时增加使用MEM_COMMIT标志,并调试为虚拟页映射物理页的过程。
答:使用MEM_RESERVE标志分配虚拟页时,没有为其映射实际的物理页。使用MEM_COMMIT表示分配虚拟页时,会为其映射实际的物理页。
6. 尝试在启动一个应用程序进程前执行“pm”命令,并记录下此时已经被占用的物理页数量;执行“vm”命令查看系统进程的虚拟地址描述符信息,并记录下系统进程已经分配的虚拟页数量。启动一个应用程序进程后,再执行“pm”命令,并记录下此时被占用的物理页数量;使用“vm”命令分别查看系统进程和应用程序进程的虚拟地址描述符信息,分别记录下系统进程和应用程序进程已经分配的虚拟页数量。结合记录的五个数据,尝试说明由于应用程序进程执行而增加的物理页数量与增加的虚拟页数量是否一致。如果不一致,尝试说明原因。
实验体会 :
本次实验主要问题在于如何处理异常情况,也就是程序的健壮性。最开始调试结果不正确,在老师指导下进行了分步调试,修改了部分代码,最后成功了。最大的收获是:熟练对代码分步调试,找出错误。
21
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo6.com 版权所有 湘ICP备2023023988号-11
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务