物理存储器与进程逻辑地址空间的管理Word格式文档下载.docx
- 文档编号:21998518
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:23
- 大小:601.75KB
物理存储器与进程逻辑地址空间的管理Word格式文档下载.docx
《物理存储器与进程逻辑地址空间的管理Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《物理存储器与进程逻辑地址空间的管理Word格式文档下载.docx(23页珍藏版)》请在冰豆网上搜索。
每个物理页的大小是4KB,由宏PAGE_SIZE定义。
全局变量MiZeroedPageCount和MiFreePageCount分别保存了零页和空闲页的数量。
计算已用物理页数量的方法是:
物理页总数减去零页数量,再减去空闲页数量。
按照下面的步骤执行控制台命令“pm”,查看物理存储器的信息:
1.按F7生成在本实验中创建的EOSKernel项目。
2.按F5启动调试。
3.待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。
观察命令执行的结果,如图1所示,可以了解当前物理存储器的使用情况。
图1:
“pm”命令的执行结果
分配物理页和释放物理页
接下来,在pm命令函数中添加分配物理页和释放物理页的代码,单步调试管理物理页的方法。
按照下面的步骤修改pm命令的源代码:
1.使用OSLab打开本实验文件夹中的文件(将文件拖动到OSLab窗口中释放即可打开)。
此文件中有一个修改后的ConsoleCmdPhysicalMemory函数,主要是在原有代码的后面增加了分配物理页和释放物理页的代码。
2.使用文件中ConsoleCmdPhysicalMemory函数的函数体替换ke/文件中ConsoleCmdPhysicalMemory函数的函数体。
3.按F7生成修改后的EOSKernel项目。
4.按F5启动调试。
5.待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。
观察命令执行的结果,如图2所示,尝试说明分配物理页或者释放物理页后物理存储器的变化情况。
图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)物理页是从空闲页链表中分配的,;
(3)第226行MiFreePageListHead=MiGetPfnDatabaseEntry(Pfn)->
Next;
和第227行MiFreePageCount--;
减少了空闲页的数量,第229行将刚刚分配的物理页由空闲状态修改为忙状态;
(4)
MiAllocateAnyPages函数的流程图
图3MiAllocateAnyPages函数监视和堆栈
继续调试释放物理页的过程:
1.按F5继续执行,会在调用MiFreePages函数的代码行处中断,按F11调试进入MiFreePages函数。
2.按F10单步调试MiFreePages函数的执行过程,尝试回答下面的问题:
(1)本次释放的物理页的数量是多少释放的物理页的页框号是多少释放的物理页是之前分配的物理页吗
(2)释放的物理页是被放入了空闲页链表中还是零页链表中
(3)绘制MiFreePages函数的流程图。
(1)本次释放的物理页的数量是1,释放的物理页的页框号0x409,释放
的物理页是之前分配的物理页;
(2)释放的物理页被放入了空闲页链表中;
(3)见下图:
MiFreePages函数的流程图
图4MiFreePages函数监视和堆栈
(问题:
两次一加一减)
结束此次调试。
继续修改pm命令的源代码,尝试在调用MiAllocateAnyPages函数时分配多个物理页,然后在调用MiFreePages函数时将分配的多个物理页释放,并练习调试这两个函数在分配多个物理页和释放多个物理页时执行的过程。
阅读控制台命令“vm”相关的源代码,并查看其执行的结果
阅读ke/文件中第959行的ConsoleCmdVM函数,学习“vm”命令是如何统计并输出进程的虚拟地址描述符信息的。
与“pm”命令输出的是整个系统的物理存储器的使用情况不同,“vm”命令输出的是某个进程的虚拟地址描述符信息,所以“vm”命令使用了一个参数——进程ID,用来指定一个进程。
这个进程既可以是系统进程,也可以是用户进程。
在统计输出指定进程的虚拟地址描述符信息之前要关闭中断,之后要打开中断,这样可以防止在命令执行的过程中有其它线程分配或者释放虚拟页。
EOS操作系统的进程有4G的虚拟地址空间,但并不是所有的虚拟地址空间都使用虚拟地址描述符来管理,有一些地址空间是静态的,还有一些地址空间由其他的动态方式来管理(例如系统内存池)。
进程4G虚拟地址空间中由虚拟地址描述符所管理空间的低地址和高地址是固定的,在这段地址空间中,如果有虚拟页被占用,就会使用虚拟地址描述符来标识,并放入链表中管理。
按照下面的步骤执行控制台命令”vm”,查看系统进程的虚拟地址描述符信息:
1.按F5启动调试。
2.待EOS启动完毕,在EOS控制台中输入命令”pt”后按回车。
”pt”命令可以输出当前系统中的进程列表,其中系统进程的ID为1。
图5输入命令”pt”
3.在EOS控制台中输入命令“vm1”后按回车。
观察命令执行的结果,如图15-3所示,可以了解系统进程的虚拟地址描述符信息。
图6:
使用“vm”命令查看系统进程虚拟地址描述符的结果
系统进程中由虚拟地址描述符所管理的虚拟页只会分配给进程的句柄表(句柄表占用一个虚拟页)和线程的堆栈(堆栈占用两个虚拟页)。
结合之前“pt”命令输出的进程和线程信息可知,当前系统中只有1个系统进程以及10个系统线程,所以在图15-3中,1号描述符所包含的一个虚拟页即为系统进程的句柄表,而2到11号这10个描述符所分别包含的两个虚拟页即为10个系统线程的堆栈。
可以按照下面的步骤执行控制台命令“vm”,查看当创建了一个应用程序进程后,系统进程和应用程序进程中虚拟地址描述符的信息:
1.在“项目管理器”窗口中双击文件,使用FloppyImageEditor工具打开此软盘镜像。
2.将本实验文件夹中的文件添加到软盘镜像的根目录中(将文件拖动到FloppyImageEditor窗口中释放即可)。
EOS应用程序的源代码可以参考本实验文件夹中的文件。
3.点击FloppyImageEditor工具栏上的保存按钮,关闭该工具。
5.待EOS启动完毕,在EOS控制台中输入命令“A:
\”后按回车。
此时就使用EOS应用程序文件创建了一个应用程序进程,由于此进程执行了一个死循环,所以此进程不会结束执行,除非关闭虚拟机。
6.此时按Ctrl+F2切换到“Console-2”,然后输入命令“pt”后按回车。
输出的信息如图15-4所示。
其中ID为31的进程就是应用程序进程,ID为33的线程就是应用程序进程的主线程。
7.输入命令“vm1”后按回车,可以查看系统进程中虚拟地址描述符的信息。
输出的信息如图6所示。
与图15-3比较可知,3号描述符所包含的一个虚拟页即为应用程序进程的句柄表,13号描述符所包含的两个虚拟页即为应用程序进程主线程的堆栈。
8.输入命令“vm31”后按回车,可以查看应用程序进程中虚拟地址描述符的信息。
输出的信息如图7所示。
图7:
使用pt命令查看有应用程序运行时进程和线程的信息。
图8:
创建了一个应用程序进程后,系统进程中虚拟地址描述符的信息。
图9:
使用“vm”命令查看应用程序进程虚拟地址描述符的结果。
在进程的4G逻辑地址空间中,应用程序进程可以自行管理低2G的用户空间。
从图15-6中的信息可以得知,低2G的用户空间又被分为了三部分:
0x00000000-0x0000FFFF由16个虚拟页构成的64KB静态空间,用于捕捉对空指针的非法访问。
0x00010000-0x7FFEFFFF由虚拟地址描述符管理的动态空间,用于存储应用程序进程的代码和数据。
图15-6显示应用程序进程的代码和数据占用了此空间中的5个虚拟页,并且是用从应用程序的基址0x00400000起始的。
0x7FFF0000-0x7FFFFFFF由16个虚拟页构成的64KB静态空间,用于捕捉对空指针的非法访问。
为了加深对进程逻辑地址空间的理解,可以在控制台1至控制台7中都执行命令”A:
\”,从而让应用程序创建7个进程,然后在控制台8中执行”pt”、”vm”等命令,查看系统进程和应用程序进程的虚拟地址描述符。
在系统进程中分配虚拟页和释放虚拟页
接下来,在vm命令函数中添加分配虚拟页和释放虚拟页的代码,单步调试管理虚拟页的方法。
首先,按照下面的步骤修改vm命令的源代码:
此文件中有一个修改后的ConsoleCmdVM函数,主要是在原有代码的后面增加了分配虚拟页和释放物理页的代码。
2.使用文件中ConsoleCmdVM函数的函数体替换ke/文件中ConsoleCmdVM函数的函数体。
5.待EOS启动完毕,在EOS控制台中输入命令“vm1”后按回车。
命令执行的结果会同时转储在“输出”窗口中,内容如图15-7所示。
尝试说明分配虚拟页或者释放虚拟页后虚拟地址描述符以及物理存储器的变化情况。
图10命令执行情况
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:
0xA0003000.Size:
0x1000.
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.(0xA0013000-0xA0014FFF)
12#VadInclude2VpnFrom655381to655382.(0xA0015000-0xA0016FFF)
22.
2026.
FreeVM'
图15-7:
分配虚拟页或者释放虚拟页后虚拟地址描述符及物理存储器的变化情况。
1.在ke/文件的ConsoleCmdVM函数中,在调用MmAllocateVirtualMemory函数的代码行(第1082行)添加一个断点,在调用MmFreeVirtualMemory函数的代码行(第1147行)添加一个断点。
3.待EOS启动完毕,在EOS控制台中输入命令“vm1”后按回车。
图11输入命令“vm1”
4.vm命令开始执行后,会在调用MmAllocateVirtualMemory函数的代码行处中断。
此时要注意参数BaseAddress和RegionSize初始化的值。
按F11调试进入MmAllocateVirtualMemory函数。
图11进入MmAllocateVirtualMemory函数前
进入函数后:
图12进入MmAllocateVirtualMemory函数后
5.按F10单步调试MmAllocateVirtualMemory函数的执行过程,尝试回答下面的问题:
(1)分配的虚拟页的起始地址是多少分配的虚拟页的数量是多少它们和参数BaseAddress和RegionSize初始化的值有什么样的关系
(2)分配虚拟页的同时有为虚拟页映射实际的物理页吗这是由哪个参数决定的
(3)分配的虚拟页是在系统地址空间(高2G)还是在用户地址空间(低2G)这是由哪个参数决定的
(4)参考MiReserveAddressRegion函数的定义和注释,说明该函数的功能。
继续调试释放虚拟页的过程:
(1)分配的虚拟页的起始地址是0xa0003000,分配的虚拟页的数量是1,BaseAddress和RegionSize初始化的值是期望保留或者提交的地址区域的起始地址和大小;
(2)分配虚拟页的同时有为虚拟页映射实际的物理页,这是由第三个参数AllocationType决定的;
(3)分配的虚拟页是在系统地址空间(高2G),这是由第四个参数SystemVirtual决定的;
(4)MiReserveAddressRegion函数的功能是保留一段虚拟地址区域。
1.按F5继续执行,会在调用MmFreeVirtualMemory函数的代码行处中断。
按F11调试进入MmFreeVirtualMemory函数。
图13进入MmFreeVirtualMemory函数
图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,观察“输出”窗口中转储的信息,并说明申请虚拟内存的大小与实际分配的大小之间的关系,以及申请的虚拟地址会对分配的虚拟内存大小产生什么样的影响。
在应用程序进程中分配虚拟页和释放虚拟页
3.6.1要求
创建一个EOS应用程序,并编写代码完成下
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 物理 存储器 进程 逻辑 地址 空间 管理