您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 物理存储器与进程逻辑地址空间的管理
《操作系统》实验报告实验题目物理存储器与进程逻辑地址空间的管理学生姓名lee学号专业班级指导教师院系名称计算机与信息学院2017年10月30日实验7物理存储器与进程逻辑地址空间的管理1.实验目的与要求通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。2.实验原理阅读本书第6章。重点阅读第6.3节和第6.6节,了解物理存储器的管理方式和进程逻辑地址空间的管理方式。3.实验内容3.1准备实验按照下面的步骤准备实验:1.启动OSLab。2.新建一个EOSKernel项目。3.2阅读控制台命令“pm”相关的源代码,并查看其执行的结果阅读ke/sysproc.c文件中第1059行的ConsoleCmdPhysicalMemory函数,学习“pm”命令是如何统计并输出物理存储器信息的。在阅读的过程中需要注意下面几点:在统计输出物理存储器信息之前要关闭中断,之后要打开中断,这样可以防止在命令执行的过程中有其它线程分配或者释放物理页。全局变量MiTotalPageFrameCount保存了物理页的总数。每个物理页的大小是4KB,由宏PAGE_SIZE定义。全局变量MiZeroedPageCount和MiFreePageCount分别保存了零页和空闲页的数量。计算已用物理页数量的方法是:物理页总数减去零页数量,再减去空闲页数量。按照下面的步骤执行控制台命令“pm”,查看物理存储器的信息:1.按F7生成在本实验3.1中创建的EOSKernel项目。2.按F5启动调试。3.待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。观察命令执行的结果,如图1所示,可以了解当前物理存储器的使用情况。图1:“pm”命令的执行结果3.3分配物理页和释放物理页接下来,在pm命令函数中添加分配物理页和释放物理页的代码,单步调试管理物理页的方法。按照下面的步骤修改pm命令的源代码:1.使用OSLab打开本实验文件夹中的pm.c文件(将文件拖动到OSLab窗口中释放即可打开)。此文件中有一个修改后的ConsoleCmdPhysicalMemory函数,主要是在原有代码的后面增加了分配物理页和释放物理页的代码。2.使用pm.c文件中ConsoleCmdPhysicalMemory函数的函数体替换ke/sysproc.c文件中ConsoleCmdPhysicalMemory函数的函数体。3.按F7生成修改后的EOSKernel项目。4.按F5启动调试。5.待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。观察命令执行的结果,如图2所示,尝试说明分配物理页或者释放物理页后物理存储器的变化情况。图2:分配物理页或者释放物理页后物理存储器的变化情况。按照下面的步骤调试分配物理页和释放物理页的过程:1.结束之前的调试。2.在ke/sysproc.c文件的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函数时将分配的多个物理页释放,并练习调试这两个函数在分配多个物理页和释放多个物理页时执行的过程。3.4阅读控制台命令“vm”相关的源代码,并查看其执行的结果阅读ke/sysproc.c文件中第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.在“项目管理器”窗口中双击Floppy.img文件,使用FloppyImageEditor工具打开此软盘镜像。2.将本实验文件夹中的LoopApp.exe文件添加到软盘镜像的根目录中(将LoopApp.exe文件拖动到FloppyImageEditor窗口中释放即可)。EOS应用程序LoopApp.exe的源代码可以参考本实验文件夹中的LoopApp.c文件。3.点击FloppyImageEditor工具栏上的保存按钮,关闭该工具。4.按F5启动调试。5.待EOS启动完毕,在EOS控制台中输入命令“A:\LoopApp.exe”后按回车。此时就使用EOS应用程序文件LoopApp.exe创建了一个应用程序进程,由于此进程执行了一个死循环,所以此进程不会结束执行,除非关闭虚拟机。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:\LoopApp.exe”,从而让应用程序创建7个进程,然后在控制台8中执行”pt”、”vm”等命令,查看系统进程和应用程序进程的虚拟地址描述符。3.5在系统进程中分配虚拟页和释放虚拟页接下来,在vm命令函数中添加分配虚拟页和释放虚拟页的代码,单步调试管理虚拟页的方法。首先,按照下面的步骤修改vm命令的源代码:1.使用OSLab打开本实验文件夹中的vm.c文件(将文件拖动到OSLab窗口中释放即可打开)。此文件中有一个修改后的ConsoleCmdVM函数,主要是在原有代码的后面增加了分配虚拟页和释放物理页的代码。2.使用vm.c文件中ConsoleCmdVM函数的函数体替换ke/sysproc.c文件中ConsoleCmdVM函数的函数体。3.按F7生成修改后的EOSKernel项目。4.按F5启动调试。5.待EOS启动完毕,在EOS控制台中输入命令“vm1”后按回车。命令执行的结果会同时转储在“输出”窗口中,内容如图15-7所示。尝试说明分配虚拟页或者释放虚拟页后虚拟地址描述符以及物理存储器的变化情况。图10命令执行情况TotalVpnfrom655360to657407.(0xA0000000-0xA07FFFFF)1#VadInclude1VpnFrom655360to655360.(0xA0000000-0xA0000FFF)2#VadInclude2VpnFrom655361to655362.(0xA0001000-0xA0002FFF)3#VadInclude2VpnFrom655365to655366.(0xA0005000-0xA0006FFF)4#VadInclude2VpnFrom6
本文标题:物理存储器与进程逻辑地址空间的管理
链接地址:https://www.777doc.com/doc-6170199 .html