1、操作系统实验物理存储器heu操作系统实 验 报 告课程名称操作系统实验课程编号0906553实验项目名称物理存储器与进程逻辑地址空间的管理学号年级姓名专业学生所在学院指导教师实验室名称地点 哈尔滨工程大学计算机科学与技术学院第七讲 物理存储器与进程逻辑地址空间的管理一、实验概述1. 实验名称物理存储器与进程逻辑地址空间的管理2. 实验目的1)通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。2)通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。3. 实验类型验证型实验,设计型实验4. 实验内容(1)准备实验(2
2、)阅读控制台命令“pm”相关的源代码,并查看其执行的结果(3)分配物理页和释放物理页 (4)阅读控制台命令“vm”相关的源代码,并查看其执行的结果(5)在系统进程中分配虚拟页和释放虚拟页(6)在应用程序进程中分配虚拟页和释放虚拟页二、实验环境WINDOWS XP系统,EOS操作系统三、实验过程1. 设计思路和流程图2. 算法实现3. 需要解决的问题及解答4. 主要数据结构、实现代码及其说明5. 源程序并附上注释按照实验指导的P160-3.6 在应用程序进程中分配虚拟页和释放虚拟页,编写代码。#include EOSApp.hint main(int argc, char* argv)#ifde
3、f _DEBUG _asm(int $3n nop);#endifINT *d;/*调用 API 函数 VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。*/if(d=VirtualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT)printf(Allocated %d bytes virtual memory of 0x%xnn,*d);*d=0xFFFFFFFF; /*修改整型变量的值为0xFFFFFFFF。在修改前输出整型变量的值,在修改后再输出整型变量的值*/ printf(virtual memory or
4、iginal value :0x%x nn,*d);printf(nWait for 10 secondsn);Sleep(10000);/* 调用API函数Sleep等待10秒钟。*/if(VirtualFree(d,0,MEM_RELEASE) /*调用API函数VirtualFree,释放之前分配的整型变量的空间。 */printf(nRelease virtual memory sucess!n);else printf(release errorn);printf(endless loop);/*进入死循环,这样应用程序就不会结束。 */for(;);else printf(erro
5、rn);return -1; printf(Hello world!n); return 0;6. 程序运行时的初值和运行结果(1)阅读控制台命令“pm”相关的源代码,并查看其执行的结果: 1). 按 F7 生成在本实验 3.1 中创建的 EOS Kernel 项目。 2). 按 F5 启动调试。 3). 待 EOS 启动完毕,在 EOS 控制台中输入命令“pm”后按回车。 (2)分配物理页和释放物理页1). 使用 OS Lab 打开本实验文件夹中的 pm.c 文件(将文件拖动到 OS Lab 窗口中释放即可打开)。此文件中有一个修改后的 ConsoleCmdPhysicalMemory 函数
6、,主要是在原有代码的后面增加了分配物理页和释放物理页的代码。2). 使 用 pm.c 文 件 中 ConsoleCmdPhysicalMemory 函 数 的 函 数 体 替 换ke/sysproc.c 文 件 中ConsoleCmdPhysicalMemory 函数的函数体。 3). 按 F7 生成修改后的 EOS Kernel 项目。4). 按 F5 启动调试。 5). 待 EOS 启动完毕,在 EOS 控制台中输入命令“pm”后按回车。6). 结束之前的调试。7) .在 ke/sysproc.c 文件的 ConsoleCmdPhysicalMemory 函数中,在调用 MiAllocat
7、eAnyPages 函数的代码行(第 1103 行)添加一个断点,在调用 MiFreePages 函数的代码行(第 1115 行)添加一个断点。8) . 按 F5 启动调试。9) . 待 EOS 启动完毕,在 EOS 控制台中输入命令“pm”后按回车。10) . pm 命令开始执行后,会在调用 MiAllocateAnyPages 函数的代码行处中断,按 F11 调试进入MiAllocateAnyPages 函数。11) . 按 F5 继续执行,会在调用 MiFreePages 函数的代码行处中断,按 F11 调试进入 MiFreePages 函数。(3)阅读控制台命令“vm”相关的源代码,并
8、查看其执行的结果1). 按 F5 启动调试2). 待 EOS 启动完毕,在 EOS 控制台中输入命令“pt”后按回车。“pt”命令可以输出当前系统中的进程列表,其中系统进程的 ID 为 13). 在 EOS 控制台中输入命令“vm 1”后按回车。 4). 在“项目管理器”窗口中双击 Floppy.img 文件,使用 FloppyImageEditor 工具打开此软盘镜 像。5). 将本实验文件夹中的 LoopApp.exe 文件添加到软盘镜像的根目录中(将 LoopApp.exe 文件拖动到FloppyImageEditor 窗口中释放即可)。EOS 应用程序 LoopApp.exe 的源代码
9、可以参考本实验文件夹中的 LoopApp.c 文件。6). 点击 FloppyImageEditor 工具栏上的保存按钮,关闭该工具。7). 按 F5 启动调试。8). 待 EOS 启动完毕,在 EOS 控制台中输入命令“A:LoopApp.exe”后按回车。此时就使用 EOS 应用程序文件 LoopApp.exe 创建了一个应用程序进程,由于此进程执行了一个死循环,所以此进程不会结束执行,除非关闭虚拟机。 9). 此时按 Ctrl+F2 切换到“Console-2”,然后输入命令“pt”后按回车。输出的信息如图所示。其中 ID 为 31 的进程就是应用程序进程,ID 为 33 的线程就是应用
10、程序进程的主线程。10). 输入命令“vm 1”后按回车,可以查看系统进程中虚拟地址描述符的信息。输出的信息如图 15-5所示。与图 15-3 比较可知,3 号描述符所包含的一个虚拟页即为应用程序进程的句柄表,13 号描述符所包含的两个虚拟页即为应用程序进程主线程的堆栈。11). 输入命令“vm 31”后按回车,可以查看应用程序进程中虚拟地址描述符的信息。输出的信息如图所示。(4)在系统进程中分配虚拟页和释放虚拟页 1). 使用 OS Lab 打开本实验文件夹中的 vm.c 文件(将文件拖动到 OS Lab 窗口中释放即可打开)。此文件中有一个修改后的 ConsoleCmdVM 函数,主要是在
11、原有代码的后面增加了分配虚拟页和释放物理页的代码。2). 使用 vm.c 文件中 ConsoleCmdVM 函数的函数体替换 ke/sysproc.c 文件中 ConsoleCmdVM 函数的函数体。 3). 按 F7 生成修改后的 EOS Kernel 项目。 4). 按 F5 启动调试。 5). 待 EOS 启动完毕,在 EOS 控制台中输入命令“vm 1”后按回车。6). 在 ke/sysproc.c 文件的 ConsoleCmdVM 函数中,在调用 MmAllocateVirtualMemory 函数的代码行(第 1082 行)添加一个断点,在调用 MmFreeVirtualMemor
12、y 函数的代码行(第 1147 行)添加一个断点。7). 按 F5 启动调试。8). 待 EOS 启动完毕,在 EOS 控制台中输入命令“vm 1”后按回车。9). vm 命令开始执行后,会在调用 MmAllocateVirtualMemory 函数的代码行处中断。此时要注意参数BaseAddress 和 RegionSize 初始化的值。按 F11 调试进入 MmAllocateVirtualMemory 函数。10). 按 F10 单步调试 MmAllocateVirtualMemory 函数的执行过程11). 按 F5 继续执行,会在调用 MmFreeVirtualMemory 函数的代
13、码行处中断。此时要注意参数BaseAddress 和 RegionSize 初始化的值。按 F11 调试进入 MmFreeVirtualMemory 函数。 12). 按 F10 单步调试 MmFreeVirtualMemory 函数的执行过程 13). 尝试在调用 MmAllocateVirtualMemory 函数时将 RegionSize 参数的值设置为 PAGE_SIZE+1 或者PAGE_SIZE*2+1。观察“输出”窗口中转储的信息,并说明申请虚拟内存的大小与实际分配的大小之间的关系,以及分配的虚拟内存大小会对分配的虚拟地址产生什么样的影响。将“输出”窗口中转储的信息保存在文本文件
14、中。 14). 尝试在调用 MmAllocateVirtualMemory 函数时将 BaseAddress 参数的值设置为已经被占用的虚拟内存,例如 0xA0000000,观察“输出”窗口中转储的信息。将“输出”窗口中转储的信息保存在文本文件中。15). 尝试在调用 MmAllocateVirtualMemory 函数时将 RegionSize 参数的值设置为 PAGE_SIZE*2,将BaseAddress 参数的值设置为 0xA0017004,观察“输出”窗口中转储的信息,并说明申请虚拟内存的大小与实际分配的大小之间的关系,以及申请的虚拟地址会对分配的虚拟内存大小产生什么样的影响。将“输
15、出”窗口中转储的信息保存在文本文件中。(5)在应用程序进程中分配虚拟页和释放虚拟页1). 创建一个 EOS 应用程序,并编写代码完成下列功能: 调用 API 函数 VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。 修改整型变量的值为 0xFFFFFFFF。在修改前输出整型变量的值,在修改后再输出整型变量的值。 调用 API 函数 Sleep,等待 10 秒钟。 调用 API 函数 VirtualFree,释放之前分配的整型变量的空间。 进入死循环,这样应用程序就不会结束。 2). 测试代码修改完毕后,按 F7 生成 EOS 应用程序项目。 按 F5
16、启动调试,应用程序自动执行后输出的结果可以参照图 15-8 所示。 在应用程序分配虚拟页后,利用 10 秒后才释放虚拟页的间隙,可以在控制台 2 中执行命令“vm31”,查看此时应用程序进程的虚拟地址描述符信息;在应用程序释放虚拟页后,可以在控 制台 2 中再次执行命令“vm 31”,查看此时应用程序进程的虚拟地址描述符信息。输出的结果如图所示。 四、实验体会在本次实验里我增强了对于物理存储相关知识的了解,我也知道了进程逻辑地址空间管理方法。我学会了怎样查看物理存储器的使用情况和进程逻辑地址空间的使用情况。我了解了如何分配和回收物理内存,虚拟内存,增强了对于课本知识的理解和记忆。这次实验不仅让我增强了对知识的了解,更增强了我的动手能力。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1