(第四讲 物理存储器与进程逻辑地址空间的管理)
- 格式:doc
- 大小:281.00 KB
- 文档页数:8
物理存储和逻辑存储的关系物理存储和逻辑存储是计算机存储系统中两个重要的概念,它们之间存在着密切的关系。
物理存储是指实际的硬件设备,如硬盘驱动器、固态硬盘、内存条等,这些设备用来存储数据和程序。
逻辑存储则是指对数据和程序的逻辑组织和管理方式,它与实际的硬件设备无关,而是涉及到数据的组织、访问和管理的逻辑结构。
首先,物理存储和逻辑存储之间的关系在于逻辑存储是建立在物理存储之上的。
逻辑存储是通过对物理存储进行抽象和管理,使得数据可以按照逻辑结构进行组织和访问。
例如,在计算机中,文件系统是一种逻辑存储的组织方式,它将数据以文件的形式存储在物理存储设备上,并提供了对这些文件的逻辑访问方式。
其次,逻辑存储的设计和管理是建立在对物理存储设备特性的理解和利用之上的。
逻辑存储需要考虑到物理存储设备的性能、容量、可靠性等特点,以便更好地利用物理存储设备的资源。
例如,虚拟内存是一种逻辑存储的管理方式,它通过将部分数据存储在物理存储设备上,以扩展计算机的内存容量,提高系统的性能。
另外,物理存储和逻辑存储之间的关系还体现在数据的存储和访问过程中。
逻辑存储通过文件系统、数据库管理系统等软件来管理数据的逻辑组织和访问方式,而这些数据最终是存储在物理存储设备上的。
因此,逻辑存储需要与物理存储设备进行交互,将数据存储在物理存储设备上,并通过物理存储设备提供的接口来访问和操作数据。
综上所述,物理存储和逻辑存储之间是密切相关的。
逻辑存储是建立在物理存储之上的,它通过对物理存储设备的抽象和管理,实现了对数据的逻辑组织和访问。
同时,逻辑存储的设计和管理也需要考虑到物理存储设备的特性,以便更好地利用物理存储设备的资源。
最终,数据的存储和访问过程也体现了物理存储和逻辑存储之间的密切关系。
操作系统的内存管理与地址空间操作系统是计算机系统中的核心组件,负责管理计算机硬件和软件资源。
其中,内存管理是操作系统的重要功能之一,它负责管理计算机的内存资源,并为进程分配合适的内存空间。
本文将探讨操作系统的内存管理和地址空间。
一、内存管理的背景随着计算机技术的发展,计算机的内存容量越来越大,但是内存资源始终是有限的。
操作系统需要有效地管理这些内存资源,以便给进程提供足够的内存空间。
同时,不同的进程需要互相隔离,确保彼此之间的内存访问不会相互干扰。
因此,内存管理成为操作系统的重要任务。
二、内存管理的基本概念与技术1. 内存分区内存分区是指将物理内存空间划分为若干个固定大小的区域,用于存放进程和操作系统的代码和数据。
常用的内存分区技术有连续分区分配、非连续分区分配等。
2. 连续分区分配连续分区分配将内存划分为若干连续的分区,每个分区存放一个进程。
这种分区方式简单高效,但容易产生内存碎片问题。
为了解决内存碎片问题,可以采用紧凑和外部碎片整理等技术。
3. 非连续分区分配非连续分区分配将内存划分为若干个不连续的分区,每个分区存放一个进程或模块。
这种分区方式可以更灵活地管理内存,但需要维护一张内存分配表来记录每个分区的状态。
4. 虚拟内存虚拟内存是一种扩展了物理内存的概念,在操作系统中,每个进程拥有独立的虚拟地址空间。
操作系统通过地址映射的方式将虚拟地址转换为物理地址,从而实现对进程的内存管理。
虚拟内存的引入使得进程能够占用比物理内存更多的内存空间,大大提高了系统的性能和资源利用率。
三、地址空间的划分1. 内核空间内核空间是操作系统独占的地址空间,为了保护操作系统的核心代码和数据,它被设置为只能由内核态访问。
内核空间通常包括操作系统的内核代码、驱动程序、中断处理程序等。
2. 用户空间用户空间是供应用程序运行的地址空间,它通常只能由用户态访问。
用户空间包含了应用程序的代码、数据和堆栈等。
操作系统通过虚拟内存管理机制,为每个进程分配独立的用户空间,确保进程之间的内存互相隔离。
第四章存储器管理第0节存储管理概述一、存储器的层次结构1、在现代计算机系统中,存储器是信息处理的来源与归宿,占据重要位置。
但是,在现有技术条件下,任何一种存储装置,都无法从速度、容量、是否需要电源维持等多方面,同时满足用户的需求。
实际上它们组成了一个速度由快到慢,容量由小到大的存储装置层次。
2、各种存储器•寄存器、高速缓存Cache:少量的、非常快速、昂贵、需要电源维持、CPU可直接访问;•内存RAM:若干(千)兆字节、中等速度、中等价格、需要电源维持、CPU可直接访问;•磁盘高速缓存:存在于主存中;•磁盘:数千兆或数万兆字节、低速、价廉、不需要电源维持、CPU 不可直接访问;由操作系统协调这些存储器的使用。
二、存储管理的目的1、尽可能地方便用户;提高主存储器的使用效率,使主存储器在成本、速度和规模之间获得较好的权衡。
(注意cpu和主存储器,这两类资源管理的区别)2、存储管理的主要功能:•地址重定位•主存空间的分配与回收•主存空间的保护和共享•主存空间的扩充三、逻辑地址与物理地址1、逻辑地址(相对地址,虚地址):用户源程序经过编译/汇编、链接后,程序内每条指令、每个数据等信息,都会生成自己的地址。
●一个用户程序的所有逻辑地址组成这个程序的逻辑地址空间(也称地址空间)。
这个空间是以0为基址、线性或多维编址的。
2、物理地址(绝对地址,实地址):是一个实际内存单元(字节)的地址。
●计算机内所有内存单元的物理地址组成系统的物理地址空间,它是从0开始的、是一维的;●将用户程序被装进内存,一个程序所占有的所有内存单元的物理地址组成该程序的物理地址空间(也称存储空间)。
四、地址映射(变换、重定位)当程序被装进内存时,通常每个信息的逻辑地址和它的物理地址是不一致的,需要把逻辑地址转换为对应的物理地址----地址映射;地址映射分静态和动态两种方式。
1、静态地址重定位是程序装入时集中一次进行的地址变换计算。
物理地址= 重定位的首地址+ 逻辑地址•优点:简单,不需要硬件支持;•缺点:一个作业必须占据连续的存储空间;装入内存的作业一般不再移动;不能实现虚拟存储。
操作系统实验报告哈尔滨工程大学计算机科学与技术学院物理存储器与进程逻辑地址空间的管理一.实验概述:1.实验名称:物理存储器与进程逻辑地址空间的管理2.实验目的:1)通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法;2)通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。
3.实验类型:验证、设计4.实验内容:1)准备实验,创建一个EOS Kernel项目;2)阅读控制台命令“pm”相关的源代码,并查看其执行的结果;3)分配物理页和释放物理页;4)阅读控制台命令“vm”相关的源代码,并查看执行的结果;5)在系统进程中分配虚拟页和释放虚拟页;6)在应用程序进程中分配虚拟页和释放虚拟页。
二.实验环境操作系统:windows XP编译器:Tevalaton OS Lab语言:C三.实验过程1.设计思路和流程图:MiAllocateAny函数流程图:MiFreePages函数流程图:2.实验过程:1)新建一个EOS Kernel 项目;2)阅读ke/sysproc.c 文件中的ConsoleCmdPhysicalMemory 函数,学习“pm”命令是如何统计并输出物理存储器信息的。
在阅读的过程中应注意:①在统计输出物理存储器信息之前要关闭中断,之后要打开中断,这样可以防止在命令执行的过程中有其它线程分配或者释放物理页;②全局变量MiTotalPageFrameCount 保存了物理页的总数。
每个物理页的大小是4KB,由宏PAGE_SIZE 定义;③全局变量MiZeroedPageCount 和MiFreePageCount 分别保存了零页和空闲页的数量;④计算已用物理页数量的方法是:物理页总数减去零页数量,再减去空闲页数量。
3)生成所创建的项目,启动调试,待EOS启动完毕,在EOS控制台中输入命令“pm”后回车,观察命令执行的结果。
物理地址和逻辑地址概述当操作数是存放在存储器中时,存储器的存储单元的物理地址有两部分组成.一部分是偏移地址,一部分是段地址。
在8086/8088的各种寻址方式中,寻找存储单元所需的偏移地址可由各种成分组成,称为有效地址,用EA表示.可以通过存储器寻址方式获得有效地址。
8086/8088CPU的地址线有20根,直接寻址220=1MB.而8086/8088CPU的字长为16位,直接寻址216=64KB,无法寻址1MB。
为此,8086/8088采用了存储器地址分段的方法。
将整个存储器分成许多逻辑段,每个逻辑段的容量最多为64KB,允许它们在整个存储器空间浮动,各个逻辑段可以紧密相连,也可以重叠。
对于任何一个物理地址来说,可以唯一地被包含在一个逻辑段中,也可以被包含在多个相互重叠的逻辑段中,只要能得到它所在段的首地址和段内相对地址,就可以对它进行访问。
在8086/8088存储空间中,从0地址开始,把每16个连续字节的存储空间称为小节。
为了简化操作,逻辑段必须从任一小节的首地址开始。
这样划分的特点是:在16进制表示的地址中,最低位为0(即20位地址中的低4位为0)。
综上所述,分段的原则如下:(1)每个段的最大长度为64KB;(2)段的首地址能被16整除。
8086/8088中,每一个存储单元都有一个唯一的20位地址,称此地址为该存储单元的物理地址。
CPU访问存储器时,必须先确定所要访问的存储单元地址才能取得该单元的内容。
20位的物理地址由16位的段地址和16位的段内偏移地址计算得到。
段地址是每一逻辑段的起始地址,必须是每个小节的首地址,其低4位一定是0,于是在保留段地址时,可以只取段地址的高16位。
偏移地址则是在段内相对于段起始地址的偏移值。
因此任一存储单元物理地址的计算方法如下:物理地址=16×段地址+段内偏移地址在微型计算机中,设有4个存放段地址...的寄存器,称为段寄存器。
它们是代码段寄存器CS、数据段寄存器DS、附加段寄存器ES、堆栈段寄存器SS。
操作系统实验报告哈尔滨工程大学软件学院第四讲物理存储器与进程逻辑地址空间的管理一、实验概述1. 实验名称物理存储器与进程逻辑地址空间的管理2. 实验目的通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。
通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。
3. 实验类型(验证、设计)验证+设计4. 实验内容(1)准备实验(2)执行控制台命令“pm”,查看物理存储器的信息(3)分配物理页和释放物理页: a. 在pm命令函数中添加分配物理页和释放物理页的代码 b. 单步调试分配物理页和释放物理页(4)执行控制台命令“vm”,查看系统进程的虚拟地址描述符信息执行控制台命令“vm”,查看当创建了一个应用程序进程后,系统进程和应用程序进程中虚拟地址描述符的信息(5)在系统进程中分配虚拟页和释放虚拟页(6)在应用程序进程中分配虚拟页和释放虚拟页(7)结束实验二、实验环境操作系统:Windows xp实验环境:Oslab;编程语言:C++三、实验过程(每次实验不一定下面6条都写,根据实际情况定)1. 设计思路和流程图2. 源程序并附上注释#include "EOSApp.h"int main(int argc, char* argv[]){#ifdef _DEBUG__asm("int $3\n nop");#endifINT *a;if(d=VirtualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT)){//调用API函数VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。
printf("Allocated %d bytes virtual memory of 0x%x\n\n",sizeof(int),a);printf("virtual memory original value:0x%x\n\n",*a);//输出原始整型变量的值*d=0xFFFFFFFF;//修改整型变量的值为0xFFFFFFFFprintf("virtual memory new value:0x%x\n\n",*a);//输出修改后的整型变量的值printf("\nWait for 10 seconds\n");Sleep(10000);// 调用API函数Sleep,等待10秒钟。
什么是逻辑地址和物理地址有网友问到小编:什么是逻辑地址和物理地址?怎么转换?针对此问题,店铺为大家分享了具体的操作方法,希望对你有帮助!什么是逻辑地址是指由程式产生的和段相关的偏移地址部分。
例如,你在进行C 语言指针编程中,能读取指针变量本身值(&操作),实际上这个值就是逻辑地址,他是相对于你当前进程数据段的地址,不和绝对物理地址相干。
只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换);逻辑也就是在Intel保护模式下程式执行代码段限长内的偏移地址(假定代码段、数据段如果完全相同)。
应用程式员仅需和逻辑地址打交道,而分段和分页机制对你来说是完全透明的,仅由系统编程人员涉及。
应用程式员虽然自己能直接操作内存,那也只能在操作系统给你分配的内存段操作。
什么是物理地址用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。
——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。
所以,说它是“与地址总线相对应”,是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理地址与物理的内存一一对应,也是可以接受的。
也许错误的理解更利于形而上的抽像。
虚拟内存(virtual memory) 这是对整个内存(不要与机器上插那条对上号)的抽像描述。
它是相对于物理内存来讲的,可以直接理解成“不直实的”,“假的”内存,例如,一个0x08000000内存地址,它并不对就物理地址上那个大数组中0x08000000 - 1那个地址元素;之所以是这样,是因为现代操作系统都提供了一种内存管理的抽像,即虚拟内存(virtual memory)。
进程使用虚拟内存中的地址,由操作系统协助相关硬件,把它“转换”成真正的物理地址。
物理存储和逻辑存储的关系全文共四篇示例,供读者参考第一篇示例:物理存储和逻辑存储是计算机领域中两个重要的概念,它们在存储数据时起到了不同的作用。
物理存储指的是数据在存储介质上的实际存储方式,而逻辑存储是指数据在计算机系统中的组织和管理方式。
两者之间的关系密切相互依存,物理存储和逻辑存储的良好组合能够有效提高计算机系统的性能和效率。
在计算机系统中,数据需要被存储在物理介质上,如硬盘、内存等。
物理存储涉及到如何将数据以二进制形式存储在存储介质上,并且如何在硬件层面上进行数据的读写操作。
物理存储通常由操作系统管理,它决定了数据在硬件上的实际存储位置和方式。
物理存储的主要目的是提供一个可靠的数据存储容器,确保数据能够被准确地读取和写入。
逻辑存储则是建立在物理存储之上的抽象概念,它定义了数据在逻辑上的组织方式和访问方式。
逻辑存储包括数据结构、文件系统、数据库等,它们用来组织和管理存储在物理介质上的数据。
逻辑存储使得用户可以通过高层的接口和操作来访问和处理数据,屏蔽了物理存储的细节,提高了数据的访问效率和方便性。
物理存储和逻辑存储之间的关系可以理解为硬件和软件之间的关系。
物理存储提供了数据的物理存储空间和读写操作,而逻辑存储负责对这些数据进行逻辑组织和管理。
在计算机系统中,物理存储和逻辑存储密切相互依存,彼此之间进行着密切的交互和协作。
一个良好的物理存储和逻辑存储的结合可以提高计算机系统的性能和可靠性。
在设计存储系统时,需要考虑物理存储的容量、速度、可靠性等因素,同时也要考虑逻辑存储的组织方式、访问方式、数据保护等因素。
合理地设计物理存储和逻辑存储,可以有效地提高数据的访问速度和可靠性,提升计算机系统的整体性能。
第二篇示例:物理存储和逻辑存储是信息技术领域中两个非常重要的概念,它们之间的关系密不可分,互相依托。
物理存储是指数据在计算机硬件中实际存储的地方,而逻辑存储则是指数据在逻辑上的存储位置。
两者之间的关系可以从多个方面来理解。
Word格式操作系统实验报告哈尔滨工程大学计算机科学与技术学院一、实验概述1. 实验名称物理存储器与进程逻辑地址空间的管理2. 实验目的通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。
通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。
3. 实验类型验证+设计4.实验内容 3.1 准备实验3.2 阅读控制台命令“pm”相关的源代码,并查看其执行的结果3.3 分配物理页和释放物理页3.4 阅读控制台命令“vm”相关的源代码,并查看其执行的结果3.5 在系统进程中分配虚拟页和释放虚拟页3.6 在应用程序进程中分配虚拟页和释放虚拟页3.6.1 要求3.6.2 测试方法3.6.3 提示二、实验环境操作系统 windos xp编译器 OS Lab语言 c语言三、实验过程1. 设计思路和流程图MiAllocateAnyPages函数的流程图MiFreePages函数的流程图2.需要解决的问题及解答(1)在实验指导的P160-4.和5.按F10单步调试MmAllocateVirtualMemory函数的执行过程,要求给出监视窗口BaseAddress和RegionSize个变量前后变化截图界面。
截图见3.5。
在实验指导的P160-1.和2. 按F10单步调试MmFreeVirtualMemory函数的执行过程,要求给出监视窗口BaseAddress和RegionSize个变量前后变化截图界面。
截图见3.5。
(2)按照《实验指导》的P160-3.6 在应用程序进程中分配虚拟页和释放虚拟页,编写代码。
要求至少给出源代码及其解释。
程序见3.6.2。
(3)按F10单步调试MiAllocateAnyPages函数的执行过程,尝试回答下面的问题:①本次分配的物理页的数量是多少?分配的物理页的页框号是多少?②物理页是从空闲页链表中分配的?还是从零页链表中分配的?③哪一行语句减少了空闲页的数量?哪一行语句将刚刚分配的物理页由空闲状态修改为忙状态?答:①本次分配的物理页的数量是1,分配的物理页的页框号是0x409;②物理页是从空闲页链表中分配的③第226行MiFreePageListHead=MiGetPfnDatabaseEntry(Pfn)->Next;和第227 行MiFreePageCount--;减少了空闲页的数量,第229行将刚刚分配的物理页由空闲状态修改为忙状态;(4)按F10单步调试MiFreePages函数的执行过程,尝试回答下面的问题:①本次释放的物理页的数量是多少?释放的物理页的页框号是多少?释放的物理页是之前分配的物理页吗?②释放的物理页是被放入了空闲页链表中?还是零页链表中?③绘制MiFreePages函数的流程图。
操作系统实验报告哈尔滨工程大学计算机科学与技术学院第四讲物理存储器与进程逻辑地址空间的管理一、实验概述1. 实验名称物理存储器与进程逻辑地址空间的管理2. 实验目的● 通过查看物理存储器的使用情况,并练习分配和回收物理内存,从而掌握物理存储器的管理方法。
● 通过查看进程逻辑地址空间的使用情况,并练习分配和回收虚拟内存,从而掌握进程逻辑地址空间的管理方法。
3. 实验类型验证+设计4. 实验内容1 准备实验2 阅读控制台命令“pm”相关的源代码,并查看其执行的结果3 分配物理页和释放物理页5 在系统进程中分配虚拟页和释放虚拟页4 阅读控制台命令“vm”相关的源代码,并查看其执行的结果6 在应用程序进程中分配虚拟页和释放虚拟页二、实验环境EOS操作系统和OS Lab集成实验环境。
三、实验过程3.1 阅读控制台命令“pm”相关的源代码,并查看其执行的结果阅读ke/sysproc.c文件中第1059行的ConsoleCmdPhysicalMemory函数,学习“pm”命令是如何统计并输出物理存储器信息的。
在阅读的过程中需要注意下面几点:● 在统计输出物理存储器信息之前要关闭中断,之后要打开中断,这样可以防止在命令执行的过程中有其它线程分配或者释放物理页。
● 全局变量MiTotalPageFrameCount保存了物理页的总数。
每个物理页的大小是4KB,由宏PAGE_SIZE定义。
● 全局变量MiZeroedPageCount和MiFreePageCount分别保存了零页和空闲页的数量。
● 计算已用物理页数量的方法是:物理页总数减去零页数量,再减去空闲页数量。
按照下面的步骤执行控制台命令“pm”,查看物理存储器的信息:1. 按F7生成在本实验3.1中创建的EOS Kernel项目。
2. 按F5启动调试。
3. 待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。
结果如下图1:3.2 分配物理页和释放物理页接下来,在pm命令函数中添加分配物理页和释放物理页的代码,单步调试管理物理页的方法。
按照下面的步骤修改pm命令的源代码:1. 使用OS Lab打开本实验文件夹中的pm.c文件(将文件拖动到OS Lab窗口中释放即可打开)。
此文件中有一个修改后的ConsoleCmdPhysicalMemory函数,主要是在原有代码的后面增加了分配物理页和释放物理页的代码。
2. 使用pm.c文件中ConsoleCmdPhysicalMemory函数的函数体替换ke/sysproc.c文件中ConsoleCmdPhysicalMemory函数的函数体。
3. 按F7生成修改后的EOS Kernel项目。
4. 按F5启动调试。
5. 待EOS启动完毕,在EOS控制台中输入命令“pm”后按回车。
结果如下截图2:3.3阅读控制台命令“vm”相关的源代码,并查看其执行的结果阅读ke/sysproc.c文件中第959行的ConsoleCmdVM函数,学习“vm”命令是如何统计并输出进程的虚拟地址描述符信息的。
在阅读的过程中需要注意下面几点:● 与“pm”命令输出的是整个系统的物理存储器的使用情况不同,“vm”命令输出的是某个进程的虚拟地址描述符信息,所以“vm”命令使用了一个参数——进程ID,用来指定一个进程。
这个进程既可以是系统进程,也可以是用户进程。
● 在统计输出指定进程的虚拟地址描述符信息之前要关闭中断,之后要打开中断,这样可以防止在命令执行的过程中有其它线程分配或者释放虚拟页。
● EOS操作系统的进程有4G的虚拟地址空间,但并不是所有的虚拟地址空间都使用虚拟地址描述符来管理,有一些地址空间是静态的,还有一些地址空间由其他的动态方式来管理(例如系统内存池)。
● 进程4G虚拟地址空间中由虚拟地址描述符所管理空间的低地址和高地址是固定的,在这段地址空间中,如果有虚拟页被占用,就会使用虚拟地址描述符来标识,并放入链表中管理。
结果如下截图3:系统进程中由虚拟地址描述符所管理的虚拟页只会分配给进程的句柄表(句柄表占用一个虚拟页)和线程的堆栈(堆栈占用两个虚拟页)。
结合之前“pt”命令输出的进程和线程信息可知,当前系统中只有1个系统进程以及10个系统线程,所以在图1中,1号描述符所包含的一个虚拟页即为系统进程的句柄表,而2到11号这10个描述符所分别包含的两个虚拟页即为10个系统线程的堆栈。
截图4:截图5:1.在实验指导的P160-4.和5.按F10单步调试MmAllocateVirtualMemory函数的执行过程,要求给出监视窗口BaseAddress和RegionSize个变量前后变化截图界面。
(即共2张截图(每张截图2个变量)进入MmAllocateVirtualMemory函数前和函数执行完后)MmAllocateVirtualMemory函数,监视窗口BaseAddress和RegionSize个变量前后变化截图:2. 在实验指导的P160-1.和2. 按F10单步调试MmFreeVirtualMemory函数的执行过程,要求给出监视窗口BaseAddress和RegionSize个变量前后变化截图界面。
(即共2张截图(每张截图2个变量)进入MmFreeVirtualMemory函数前和函数执行完后)MmFreeVirtualMemory函数,监视窗口BaseAddress和RegionSize个变量前后变化截图:3.按照《实验指导》的P160-3.6 在应用程序进程中分配虚拟页和释放虚拟页,编写代码。
要求至少给出源代码及其解释。
1. 代码修改完毕后,按F7生成EOS应用程序项目。
2. 按F5启动调试,应用程序自动执行后输出的结果可以参照图6所示。
截图6:3. 在应用程序分配虚拟页后,利用10秒后才释放虚拟页的间隙,可以在控制台2中执行命令“vm 31”,查看此时应用程序进程的虚拟地址描述符信息;在应用程序释放虚拟页后,可以在控制台2中再次执行命令“vm 31”,查看此时应用程序进程的虚拟地址描述符信息。
截图7:源代码:#include "EOSApp.h"//// main 函数参数的意义:// argc - argv 数组的长度,大小至少为 1,argc - 1 为命令行参数的数量。
// argv - 字符串指针数组,数组长度为命令行参数个数 + 1。
其中 argv[0] 固定指向当前// 进程所执行的可执行文件的路径字符串,argv[1] 及其后面的指针指向各个命令行// 参数。
// 例如通过命令行内容 "a:\hello.exe -a -b" 启动进程后,hello.exe 的 main 函// 数的参数 argc 的值为 3,argv[0] 指向字符串 "a:\hello.exe",argv[1] 指向// 参数字符串 "-a",argv[2] 指向参数字符串 "-b"。
//int main(int argc, char* argv[]){//// 启动调试 EOS 应用程序前要特别注意下面的问题://// 1、如果要在调试应用程序时能够调试进入内核并显示对应的源码,// 必须使用 EOS 核心项目编译生成完全版本的 SDK 文件夹,然// 后使用此文件夹覆盖应用程序项目中的 SDK 文件夹,并且 EOS// 核心项目在磁盘上的位置不能改变。
//// 2、在启动调试应用程序之前必须首先删除/禁用所有的断点,在断// 点中断 (int 3) 被命中后才能重新添加/启用断点,否则启动// 调试会失败。
//#ifdef _DEBUG__asm("int $3\n nop");#endif/* TODO: 在此处添加自己的代码 */INT *d;if(d=VirtualAlloc(0,sizeof(int),MEM_RESERVE|MEM_COMMIT)){//调用API函数VirtualAlloc,分配一个整型变量所需的空间,并使用一个整型变量的指针指向这个空间。
printf("Allocated %d bytes virtual memory of 0x%x\n\n",sizeof(int),d);printf("virtual memory original value:0x%x\n\n",*d);//输出原始整型变量的值*d=0xFFFFFFFF;//修改整型变量的值为0xFFFFFFFFprintf("virtual memory new value:0x%x\n\n",*d);//输出修改后的整型变量的值printf("\nWait for 10 seconds\n"); Sleep(10000);// 调用API函数Sleep,等待10秒钟。
系统以毫秒为单位if(VirtualFree(d,0,MEM_RELEASE))//// 调用API函数VirtualFree,释放之前分配的整型变量的空间printf("\nRealease virtual memory success!\n"); else { printf("realease error\n"); return -1; }printf("\nEndless loop!"); for(;;){; }//进入死循环,这样应用程序就不会结束return 0; } else{ printf("error\n"); return -1;//若不能成功,打印error,并返回-1。
}printf("Hello world!\n");return 0;}四、实验体会通过这实验对物理存储器与进程逻辑地址空间的管理更加了解,并掌握物理存储器的管理方法和进程逻辑地址空间的管理方法。
不过每次试验不可能一帆风顺的,而且是很容易出错,每次出错就让人很烦恼,很可能漏掉了什么步骤,这意味著要重新开始,所以这是很难受的事情。
因此我觉得做实验不要盲目的去追求快,而是一边做一边思考其中的意义,争取一次性做好。
遇到问题有时候向网络需求帮助也是一个不错的选择,但是不能一味的抄袭复制,那样就失去做实验的目的,而应该借鉴别人东西的同时要思考为什么会这样子用,这样子做,我为什么错了。
搞清楚问题的所在,才能算是真正的解决了问题。