物理存储器与进程逻辑地址空间管理实验报告

上传人:第*** 文档编号:55698480 上传时间:2018-10-04 格式:DOCX 页数:18 大小:481.91KB
返回 下载 相关 举报
物理存储器与进程逻辑地址空间管理实验报告_第1页
第1页 / 共18页
物理存储器与进程逻辑地址空间管理实验报告_第2页
第2页 / 共18页
物理存储器与进程逻辑地址空间管理实验报告_第3页
第3页 / 共18页
物理存储器与进程逻辑地址空间管理实验报告_第4页
第4页 / 共18页
物理存储器与进程逻辑地址空间管理实验报告_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《物理存储器与进程逻辑地址空间管理实验报告》由会员分享,可在线阅读,更多相关《物理存储器与进程逻辑地址空间管理实验报告(18页珍藏版)》请在金锄头文库上搜索。

1、操作系统操作系统实实 验验 报报 告告课程名称课程名称操作系统实验操作系统实验课程编号课程编号0906553实验项目名称实验项目名称物理存储器与进程逻辑地址空间的管理学号学号年级年级姓名姓名专业专业计算机科学计算机科学与技术与技术学生所在学院学生所在学院计算机科学与技计算机科学与技术学院术学院指导教师指导教师实验室名称地点实验室名称地点哈尔滨工程大学哈尔滨工程大学计算机科学与技术学院计算机科学与技术学院1物理存储器与进程逻辑地址空间的管理物理存储器与进程逻辑地址空间的管理一一实验概述:实验概述: 1.实验名称实验名称:物理存储器与进程逻辑地址空间的管理 2.实验目的:实验目的: 1)通过查看物

2、理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存 储器的管理方法; 2)通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握 进程逻辑地址空间的 管理方法。 3.实验类型:实验类型:验证、设计 4.实验内容:实验内容:1)准备实验,创建一个 EOS Kernel 项目;2)阅读控制台命令“pm”相关的源代码,并查看其执行的结果;3)分配物理页和释放物理页;4)阅读控制台命令“vm”相关的源代码,并查看执行的结果;5)在系统进程中分配虚拟页和释放虚拟页;6)在应用程序进程中分配虚拟页和释放虚拟页。 二实验环境二实验环境 操作系统:windows XP 编译器:Tev

3、alaton OS Lab 语言:C 三实验过程三实验过程 1.设计思路和流程图:设计思路和流程图: MiAllocateAny 函数流程图:函数流程图:2MiFreePages 函数流程图:函数流程图:2.实验过程:实验过程: 1)新建一个 EOS Kernel 项目; 2)阅读 ke/sysproc.c 文件中的 ConsoleCmdPhysicalMemory 函数,学习“pm”命令 是如何统计并输出物理存储器信息的。在阅读的过程中应注意: 在统计输出物理存储器信息之前要关闭中断,之后要打开中断,这样可以防止 在命令执行的过程 中有其它线程分配或者释放物理页; 全局变量 MiTotalP

4、ageFrameCount 保存了物理页的总数。每个物理页的大小是 4KB,由宏 PAGE_SIZE 定义; 全局变量 MiZeroedPageCount 和 MiFreePageCount 分别保存了零页和空闲页的 数量; 计算已用物理页数量的方法是:物理页总数减去零页数量,再减去空闲页数量。3)生成所创建的项目,启动调试,待 EOS 启动完毕,在 EOS 控制台中输入命令“pm”后回车,观察命令执行的结果。34)将修改后的 ConsoleCmdPhysicalMemory 函数进行替换,主要是在原有代码的后 面添加了分配物理页和释放物理页的代码,生成修改后的 EOS Kernel 项目,启

5、动调试, 待 EOS 启动完毕,在 EOS 控制台中输入命令“pm”后按回车;5)结束调试,在调用 MiAllocateAnyPages 函数的代码行添加一个断点,在调用 MiFreePages 函数的代码行添加一个断点;46)启动调试,待 EOS 启动完毕,在 EOS 控制台中输入命令“pm”后按回车,pm 命令开始执行后,会在调用 MiAllocateAnyPages 函数的代码行处中断,按 F11(逐语 句)调试进入 MiAllocateAnyPages 函数;按 F10(逐过程)单步调试 MiAllocateAnyPages 函数的执行过程:7)继续执行, ,会在调用 MiFreePa

6、ges 函数的代码行处中断,按 F11(逐语句)调试 进入 MiFreePages 函数;5按 F10(逐过程)单步调试 MiFreePages 函数的执行过程:68)阅读控制台命令“vm”相关的代码,并查看执行结果。阅读 ke/sysproc.c 文件中的 ConsoleCmdVM 函数,学习“vm”命令是如何统计 并输出进程的 虚拟地址描述符信息的,注意一下几点: 与“pm” ”命令输出的是整个系统的物理存储器的使用情况不同, “vm”命 令输出的是某个进程的 虚拟地址描述符信息,所以“vm”命令使用了一个参 数进程 ID,用来指定一个进程。这个进 程既可以是系统进程,也可以是 用户进程;

7、 在统计输出指定进程的虚拟地址描述符信息之前要关闭中断,之后要打开中断, 这样可以防止在命令执行的过程中有其它线程分配或者释放虚拟页; EOS 操作系统的进程有 4G 的虚拟地址空间,但并不是所有的虚拟地址空间 都使用虚拟地址描述符 来管理,有一些地址空间是静态的,还有一些地址空 间由其他的动态方式来管理(例如系统内存 池) ; 进程 4G 虚拟地址空间中由虚拟地址描述符所管理空间的低地址和高地址是固 定的,在这段地址空间中,如果有虚拟页被占用,就会使用虚拟地址描述符来 标识,并放入链表中管理; 9)启动调试,待 EOS 启动完毕,在 EOS 控制台中输入命令“pt”后按回车。“pt”命令可以

8、输出当前系统中的 进程列表,其中系统进程的 ID 为 1;7在 EOS 控制台中输入命令“vm 1”后按回车,观察命令执行的结果:系统进程中由虚拟地址描述符所管理的虚拟页只会分配给进程的句柄表(句柄表占 用一个虚拟页)和 线程的堆栈(堆栈占用两个虚拟页) 。结合之前“pt”命令输出的进 程和线程信息可知,当前系统中只有 1 个系统进程以及 10 个系统线程,所以在上图 中,1 号描述符所包含的一个虚拟页即为系统进程的句柄表,而 2 到 11 号这 10 个描 述符所分别包含的两个虚拟页即为 10 个系统线程的堆栈。 10)将 LoopApp.exe 文件添加到软盘镜像的根目录中,并保存,启动调

9、试,待 EOS 启动完毕,在 EOS 控制台中输入命令“A:LoopApp.exe”后按回车。此时就使用 EOS 应用 程序文件 LoopApp.exe 创建了一个应用程序进程,由于此进程执行了一个死循8环,所以此进程不 会结束执行,除非关闭虚拟机;11)切换到“Console-2” ,然后输入命令“pt”后按回车。输出的信息如图所示。其 中 ID 为 31 的进程就是应用程序进程,ID 为 33 的线程就是应用程序进程的主线程;12)输入命令“vm 1”后按回车,可以查看系统进程中虚拟地址描述符的信息。输 出的信息如图所示。与第 9 步图比较可知,3 号描述符所包含的一个虚拟页即为应用 程序

10、进程的句柄表,13 号描述符所包含的两个虚拟页即为应用程序进程主线程的堆栈;913)输入命令“vm 31”后按回车,可以查看应用程序进程中虚拟地址描述符的信息;在进程的 4G 逻辑地址空间中,应用程序进程可以自行管理低 2G 的用户空间。从 图 15-6 中的信息可以得知,低 2G 的用户空间又被分为了三部分: 0x00000000-0x0000FFFF 由 16 个虚拟页构成的 64KB 静态空间,用于捕捉对空 指针的非法访问; 0x00010000-0x7FFEFFFF 由虚拟地址描述符管理的动态空间,用于存储应用程 序进程的代码和数 据。上图显示应用程序进程的代码和数据占用了此空间中的

11、5 个虚拟页,并且是用从应用程 序的基址 0x00400000 起始的; 0x7FFF0000-0x7FFFFFFF 由 16 个虚拟页构成的 64KB 静态空间,用于捕捉对 空指针的非法访问。 14)在系统进程中分配虚拟页和释放虚拟页,使用修改后的 ConsoleCmdVM 函数 的函数体替换 ke/sysproc.c 文件中 ConsoleCmdVM 函数的函数体,生成修改后的 EOS Kernel 项目,启动调试,待 EOS 启动完毕,在 EOS 控制台中输入命令“vm 1”后按回车;1015)在 ke/sysproc.c 文件的 ConsoleCmdVM 函数中,在调用 MmAlloc

12、ateVirtualMemory 函数的代码行添加一个断点,在调用 MmFreeVirtualMemory 函数的代码11行添加一 个断点;16)启动调试,待 EOS 启动完毕,在 EOS 控制台中输入命令“vm 1”后按回车, vm 命令开始执行后,会在调用 MmAllocateVirtualMemory 函数的代码行处中断。此 时要注意参数 BaseAddress 和 RegionSize 初始化的值。按 F11(逐过程)调试进入 MmAllocateVirtualMemory 函数;1217)按 F10(逐过程)单步调试 MmAllocateVirtualMemory 函数的执行过程,继

13、 续执行, ,会在调用 MmFreeVirtualMemory 函数的代码行处中断。此时要注意参数 BaseAddress 和 RegionSize 初始化的值。按 F11 调试进入 MmFreeVirtualMemory 函数;1318)尝试在调用 MmAllocateVirtualMemory 函数时将 RegionSize 参数的值设置为 PAGE_SIZE+1 或者 PAGE_SIZE*2+1。观察“输出”窗口中转储的信息,并说明申 请虚拟内存的大小与实际分配的大 小之间的关系,以及分配的虚拟内存大小会对分 配的虚拟地址产生什么样的影响。将“输出”窗 口中转储的信息保存在文本文件中;1

14、419)尝试在调用 MmAllocateVirtualMemory 函数时将 BaseAddress 参数的值设置 为已经被占用的虚拟 内存,例如 0xA0000000,观察“输出”窗口中转储的信息。 将“输出”窗口中转储的信息保存在 文本文件中;20)尝试在调用 MmAllocateVirtualMemory 函数时将 RegionSize 参数的值设置为 PAGE_SIZE*2,将 BaseAddress 参数的值设置为 0xA0017004,观察“输出”窗口 中转储的信息,并说明申请虚拟内 存的大小与实际分配的大小之间的关系,以及申 请的虚拟地址会对分配的虚拟内存大小产生什么 样的影响。

15、将“输出”窗口中转储 的信息保存在文本文件中;1521)创建一个 EOS 应用程序,调用 API 函数 VirtualAlloc,分配一个整型变量所需 的空间,并使用一个整型变量的指针指向这个空间。 修改整型变量的值为 0xFFFFFFFF。在修改前输出整型变量的值,在修改后再输 出整型变量的值。 调用 API 函数 Sleep,等待 10 秒钟,调用 API 函数 VirtualFree,释放之前分配 的整型变量的空间,进入死循环,这样应用程序就不会结束。 #include “EOSApp.h” int main(int argc,char* argv) /启动调试EOS应用程序前要特别注意

16、下面的问题: / 1、如果要在调试应用程序时能够调试进入内核显示对应的源码,必须使用EOS 核心项目编译生成完全版本的SDK 文件夹,然后使用此文件夹覆盖应用程序项目 中的SDK 文件夹,并且EOS核心项目在磁盘上的位置不能改变。2、在启动调试应用程序之前必须首先删除禁用所有的断点,在断点中断(int 3) 被命中后才能重新添加启用断点,否则启动调试会失败。#ifdef_DEBUG _asm(“int$3n nop”);#endifINT* p; /调用API函数VirtualAlloc,分配一个整型变量所需的空间,并使用一个 整型变量的指针指向这个空间If(p=VirtualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT)printf(“Allocated %d bytes virtual memory of 0x%xnn”,sizeof(int),d);/输出原始整型变量的值printf(“virtual memory origina

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号