Windows的内存结构
- 格式:docx
- 大小:22.67 KB
- 文档页数:4
发展历史Windows XP 是基于Windows2000代码的产品,拥有新的用户图形界面(叫做月神Luna),它包括了一些细微的修改,其中有些看起来是从Linux的桌面环境(desktopenvironmen)如KDE中获得的灵感:带有用户图形的登陆界面就是一个例子。
此外,Windows XP 引入了一个“基于人物”的用户界面,使用户可以由工具条访问任务细节。
它还包括简化的Windows 2000的用户安全特性,并整合了防火墙,试图解决一直困扰微软的安全问题。
2001年10月,微软副总裁Jim Allchin首次展示了Windows XP。
最初发行了两个版本:专业版和家庭版。
2002年,微软遭遇美国司法部反托拉斯官司,推出Windows XP SP1 补丁包,允许消费者与电脑制造商自行移除部分结合在XP中的所谓“中介软件”技术。
2003年,中国出现最早的盗版XP,即JUJUMAO版本,其采取收费下载的模式,装机量并不算大。
2004年,微软砸3亿美元支持XP SP2发布,这是对XP的安全架构的一次大检修,增添了网络保护、安全的邮件处理和Web浏览以及PC维护方面的新技术。
2005年,微软发布64位XP客户端和服务器2个系列,支持Intel和AMD 的64位桌面处理器。
2006年,苹果推出英特尔芯片Mac电脑,向用户开放安装Windows XP。
2007年,年初Windows Vista高调发布,采用了全新图形用户界面。
但由于其兼容性差、要求配置高等问题未能得到用户认可。
微软不得不推迟停止XP发售的计划。
2008年,推出XP SP3补丁包;6月30日,微软停止XP发售。
针对Windows XP 的主要支持直至2009年4月14日,延伸支持至2014年4月8日。
2009年,Windows7操作系统正式上市。
虽然仍然不能满足所有人的需求,但因为微软不再发售XP,并且停止了主要技术支持,Windows 7开始占领市场,逐渐替代Windows XP。
实验报告课程操作系统实验项目存储管理成绩专业班级08软件指导教师姓名学号实验日期2010/11/18 4.1 Windows的内存结构4.1.1 背景知识Windows2000是32位的操作系统,它使计算机CPU可以用32位地址对32位内存块进行操作。
内存中的每一个字节都可以用一个32位的指针来寻址。
这样,最大的存储空间就是232字节或4000兆字节(4GB)。
这样,在Windows下运行的每一个应用程序都认为能独占可能的4GB大小的空间。
而另一方面,实际上没有几台机器的RAM能达到4GB,更不必说让每个进程都独享4GB内存了。
Windows在幕后将虚拟内存(Virtual Memory,VM)地址映射到了各进程的物理内存地址上。
而所谓物理内存是指计算机的RAM和由Windows分配到用户驱动器根目录上的换页文件。
物理内存完全由系统管理。
4.1.2 实验目的1)通过实验了解Windows2000内存的使用,学习如何在应用程序中管理内存,体会Windows应用程序内存的简单性和自我防护能力。
2)了解Windows2000的内存结构和虚拟内存的管理,进而了解进程堆和Windows为使用内存而提供的一些扩展功能。
4.1.3 工具/准备工作在开始本实验之前,您需要做以下准备:1)一台运行Windows 2000 Professional操作系统的计算机。
2)计算机中需安装Visual C++6.0专业版或企业版。
4.1.4 实验内容与步骤Windows提供了一个API函数即GetSystemInfo(),以便用户能检查系统中虚拟内存的一些特性。
清单1显示了如何调用该函数以及显示系统中当前内存的参数。
步骤1:登录进入Windows 2000 Professional。
步骤2:在“开始”菜单中单击“程序-Microsoft Visual Studio 6.0–Microsoft Visual C++6.0”命令,进入VisualC++窗口。
操作系统内存最全解析(内附超全思维导图)主存(RAM) 是一件非常重要的资源,必须要认真对待内存。
虽然目前大多数内存的增长速度要比IBM 7094 要快的多,但是,程序大小的增长要比内存的增长还快很多。
不管存储器有多大,程序大小的增长速度比内存容量的增长速度要快的多。
下面我们就来探讨一下操作系统是如何创建内存并管理他们的。
经过多年的研究发现,科学家提出了一种分层存储器体系(memory hierarchy),下面是分层体系的分类位于顶层的存储器速度最快,但是相对容量最小,成本非常高。
层级结构向下,其访问速度会变慢,但是容量会变大,相对造价也就越便宜。
(所以个人感觉相对存储容量来说,访问速度是更重要的)操作系统中管理内存层次结构的部分称为内存管理器(memory manager),它的主要工作是有效的管理内存,记录哪些内存是正在使用的,在进程需要时分配内存以及在进程完成时回收内存。
所有现代操作系统都提供内存管理。
下面我们会对不同的内存管理模型进行探讨,从简单到复杂,由于最低级别的缓存是由硬件进行管理的,所以我们主要探讨主存模型和如何对主存进行管理。
无存储器抽象最简单的存储器抽象是无存储器。
早期大型计算机(20 世纪60 年代之前),小型计算机(20 世纪 70 年代之前)和个人计算机(20 世纪 80 年代之前)都没有存储器抽象。
每一个程序都直接访问物理内存。
当一个程序执行如下命令:MOV REGISTER1, 1000计算机会把位置为 1000 的物理内存中的内容移到 REGISTER1 中。
因此呈现给程序员的内存模型就是物理内存,内存地址从0 开始到内存地址的最大值中,每个地址中都会包含一个 8 位位数的内存单元。
所以这种情况下的计算机不可能会有两个应用程序同时在内存中。
如果第一个程序向内存地址2000 的这个位置写入了一个值,那么此值将会替换第二个程序2000 位置上的值,所以,同时运行两个应用程序是行不通的,两个程序会立刻崩溃。
Windows内存管理之虚拟地址到物理地址的映射Win32通过一个两层的表结构来实现地址映射,因为每个进程都拥有私有的4G的虚拟内存空间,相应的,每个进程都有自己的层次表结构来实现其地址映射。
第一层称为页目录,实际就是一个内存页,Win32的内存页有4KB大小,这个内存页以4个字节分为1024项,每一项称为“页目录项”(PD E);第二层称为页表,这一层共有1024个页表,页表结构与页目录相似,每个页表也都是一个内存页,这个内存页以4KB的大小被分为1024项,页表的每一项被称为页表项(P TE),易知共有1024×1024个页表项。
每一个页表项对应一个物理内存中的某一个“内存页”,即共有1024×1024个物理内存页,每个物理内存页为4KB,这样就可以索引到4 G大小的虚拟物理内存。
如下图所示:Win32提供了4GB大小的虚拟地址空间。
因此每个虚拟地址都是一个32位的整数值,也就是我们平时所说的指针,即指针的大小为4B。
它由三部分组成,如下图:这三个部分的第一部分,即前10位为页目录下标,用来寻址页目录项,页目录项刚好1024个。
找到页目录项后,找对页目录项对应的的页表。
第二部分则是用来在页表内寻址,用来找到页表项,共有1024个页表项,通过页表项找到物理内存页。
第三部分用来在物理内存页中找到对应的字节,一个页的大小是4KB,12位刚好可以满足寻址要求。
具体的例子:假设一个线程正在访问一个指针(Win32的指针指的就是虚拟地址)指向的数据,此指针指为0x2A8E317F,下图表示了这一个过程:0x2A8E317F的二进制写法为0010101010_0011100011_000101111111,为了方便我们把它分为三个部分。
∙首先按照0010101010寻址,找到页目录项。
因为一个页目录项为4KB,那么先将0010101010左移两位,001010101000(0x2A8),用此下标找到页目录项,然后根据此页目录项定位到下一层的某个页表。
windows系统原理Windows系统是一种广泛应用于个人电脑和服务器的操作系统,它的原理是基于微软公司开发的图形用户界面。
本文将从Windows系统的原理、内核结构、启动过程以及常见问题等方面进行探讨。
一、Windows系统的原理Windows系统的原理是基于分层架构。
它由四个主要的层次构成:硬件层、内核层、系统服务层和用户界面层。
1. 硬件层:硬件层是Windows系统的最底层,它包括计算机的物理设备,如处理器、内存、硬盘、显示器等。
Windows系统通过设备驱动程序与硬件层进行交互,实现对硬件的控制和管理。
2. 内核层:内核层是Windows系统的核心组件,它负责管理系统的各种资源和提供对硬件的抽象。
内核层包括内存管理、进程管理、文件系统、设备管理等子系统,它们协同工作,为上层提供服务。
3. 系统服务层:系统服务层是建立在内核层之上的一组服务模块,它提供各种系统功能和服务,如网络服务、安全服务、事件日志、远程管理等。
系统服务层通过API调用内核层的功能来实现各种服务。
4. 用户界面层:用户界面层是Windows系统的最上层,它提供了图形用户界面(GUI)和命令行界面(CLI)两种方式供用户操作系统。
用户界面层包括桌面、任务栏、窗口管理器、输入法等组件。
二、Windows系统的内核结构Windows系统的内核结构是一个层次化的结构,包括硬件抽象层(HAL)、内核模式驱动程序、执行管理器、对象管理器、进程管理器、内存管理器、文件系统等组件。
1. 硬件抽象层(HAL):HAL是Windows系统的底层驱动程序,它提供了对硬件的抽象接口,使得上层的内核模块可以独立于硬件进行开发。
2. 内核模式驱动程序:内核模式驱动程序是在内核层运行的驱动程序,它们负责管理和控制硬件设备,如显示驱动程序、网络驱动程序等。
3. 执行管理器:执行管理器负责管理系统的进程和线程,它分配CPU时间片给不同的进程和线程,实现多任务的调度和管理。
windows的内存管理机制Windows的内存管理机制在计算机系统中,内存管理是一个非常重要的方面,它负责管理计算机系统中的内存资源,确保程序能够正常运行。
Windows作为一种常见的操作系统,也有自己独特的内存管理机制。
一、虚拟内存管理Windows采用了虚拟内存管理机制,将物理内存和虚拟地址空间进行映射,使得每个进程都拥有独立的地址空间。
这样可以提高内存利用率,同时也增加了系统的稳定性和安全性。
Windows的虚拟内存管理机制通过将虚拟地址空间划分为固定大小的页面,将页面映射到物理内存或磁盘上的页面文件。
当程序需要访问某个虚拟地址时,系统会根据页表的映射关系将对应的页面加载到物理内存中,如果物理内存不足,系统会将不常用的页面置换到磁盘上的页面文件中。
二、内存分页Windows将内存分为固定大小的页,一般为4KB。
这样的页大小既能够满足大部分程序的内存需求,又不会造成过多的内存浪费。
内存分页的好处是可以更灵活地管理内存资源。
系统可以按需分配和回收页面,提高内存利用率。
同时,内存分页也增加了内存的安全性,不同的进程之间无法直接访问对方的内存空间,避免了数据的混乱和安全风险。
三、内存保护Windows的内存管理机制还包括内存保护机制,可以确保不同进程之间的内存空间不会相互干扰。
每个进程都有自己的地址空间,内存保护机制可以防止一个进程访问其他进程的内存空间,增强了系统的稳定性和安全性。
四、内存回收Windows的内存管理机制还包括内存回收机制,当一个进程不再需要某个页面时,系统会将该页面回收,释放给其他进程使用。
内存回收可以提高内存的利用率,避免内存的浪费。
五、内存压缩Windows还引入了内存压缩的机制,当系统内存不足时,会将一部分内存压缩,从而释放出更多的内存空间。
内存压缩可以减少对磁盘页面文件的频繁访问,提高系统的响应速度。
六、内存分配Windows的内存管理机制还包括内存分配机制,用于分配和回收内存资源。
Windows内存原理与内存管理(2013-04-06 00:09:50)WIndows为每个进程分配了4GB的虚拟地址空间,让每个进程都认为自己拥有4GB的内存空间,4GB怎么来的?32位CPU可以取地址的空间为2的32次方,就是4GB(正如16位CPU有20根寻址线所有拥有2的20次方的寻址空间一样)当我们在Windows中双击一个应用程序图标后,系统为该应用程序创建一个进程,Windows 使得每个进程都拥有2GB的地址空间,这2GB地址空间用于程序存放代码,数据,堆栈,自由存储区(堆),另外2GB用于共享系统使用前面的这些地址并不是物理内存中的地址,而是该进程空间中的虚拟地址虚拟空间只是Windows为该进程分配的一个虚拟的地址空间,只有当其和物理内存相关联后才有意义内存的分页每个物理地址对应一个虚拟地址?1GB那页表该有多长,所以将内存分页管理,4K为一页,即4K就是一个最小单位。
虚拟地址到物理地址的映射见图,中间的那个就是页表了。
如何映射?进程被创建时会建立一个虚拟内从到物理内存的映射表--------页表,根据页表可以将虚拟内存和物理内存关联起来-----------------------------------------页表如何工作,怎么将虚拟地址关联物理地址----------------------------------虚拟内存是什么?就是把磁盘拿来当内存用,这是以前买电脑时的想法。
所以就一直都想不明白一个问题:要真是这样,那内存分个什么1GB,2GB,4GB,大家都买个1M的内存条,然后把自己磁盘拿来当内存用多好,比2GB,4GB不知道要大多少。
其实这个说法有一点擦边球的味道,虚拟内存是一些系统页文件,存放在磁盘上,每个系统页文件大小也为4K,物理内存也被分页,每个页大小也为4K,这样虚拟页文件和物理内存页就可以对应,实际上虚拟内存就是用于物理内存的临时存放的磁盘空间。
Windows CE 5.0和Windo ws CE 6.0的内存与系统架构1.Windows CE 5.01.1 Windows CE 5.0的系统架构1.2 Windows CE 5.0的内存架构因为WINCE是32位的嵌入式操作系统,所以WINCE的虚拟寻址能力可达4GB(为什呢,2^32=4GB),但是WINCE5.0和XP操作系统的每个进程独享4GB虚拟地址空间不同,WINCE5.0中所有的进程共享一个4G B的虚拟地址空间。
这4GB 的虚拟地址空间被分为两个2GB的区域,其中低地址的那2GB区域(0x00000000 ~ 0x7FFFF FFF)是用户虚拟空间,这块虚拟空间由应用程序的共用,也就是说应用程序申请的内存都会从低2G B虚拟内存空间分配的;而高2GB区域(0x80000000 ~0xFFFFF FFF)是操作系统的内核虚拟空间,供WINCE操作系统本身使用。
我们知道WIN CE5.0的进程数量最多只能达到32个,而且每个进程只能独享32MB的虚拟空间(这个32MB的空间也叫一个sl ot),这33个进程(32+1,这个1就是指s l ot0,因为slot0用于映射当前在处理器上执行的线程所在的进程)占用的虚拟空间0x00000000~0x41FFFFFF(slot0~slot32),slot33~slot63对应的虚拟地址空间是0x42000000~0x7FFFFFFF,这块虚拟地址空间是由所有的进程共享的,如果每个进程独享的32MB虚拟地址空间不够用,那么进程可以在这个范围申请虚拟地址空间,这个范围包括对象存储和内存映射文件(.map文件,每个进程都有自己的map文件)。
此范围的最后一个slot(slot63)从0x7E000000~0x7FFFFFFF用来存放纯资源DLL。
【原创】Windows CE操作系统内存管理总结0 概述Windows CE是一个32位的嵌入式操作系统,因此运行在Windows CE上的应用程序具有32位的寻址能力。
内存管理:1 物理内存RAM为操作系统和应用程序提供运行和缓冲空间。
易失性存储器根据工作原理不同分为两种:静态读写存储器SRAM,SRAM基于触发器原理;动态读写寄存器DRAM,DRAM是基于分布电容存储器原理。
DRAM 是动态存储器(Dynamic RAM)的缩写,SDRAM 是英文Synchronous DRAM 的缩写,译成中文就是同步动态存储器。
从技术角度上讲,同步动态存储器(SDRAM)是在现有的标准动态存储器中加入同步控制逻辑(一个状态机),利用一个单一的系统时钟同步所有的地址数据和控制信号。
使用SDRAM 不但能提高系统表现,还能简化设计、提供高速的数据传输。
在功能上,它类似常规的DRAM,且也需时钟进行刷新。
可以说,SDRAM 是一种改善了结构的增强型DRAM。
ROM通常用来存储程序,其内容可断电永久保存,它通常包括操作系统映像本身和组成操作系统的一些其他文件。
ROM,只读存储器。
可编程的ROM有:紫外线可擦除型ROM:EPROM,需要用紫外线擦出已写入的程序,必须脱机固化,不能在线改写电可擦除型ROM:E2PROM,被广泛使用Flash与ROM相比最大的优点是可擦写,这样它既可以用来存储操作系统本身,也可以用来存储后来安装的程序。
从结构上来说,Flash主要有AND,NAND,NOR及DiNOR等。
NAND与NOR对比:Windows CE最大支持512MB的物理内存。
2 虚拟内存为什么要使用虚拟内存?ROM DLL vs RAM DLL?Windows XP的每个进程独享4GB虚拟地址空间,而Windows CE中所有的进程共享一个4GB的虚拟地址空间。
Windows CE 操作系统支持两种页大小:1KB和4KB。
虚拟内存:最适合用来管理大型对象数组或大型结构数组。
内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间共享数据。
堆:最适合用来管理大量的小型对象。
工作集(Working Set):缓存到主存中的那些页面。
进程的虚拟地址空间每个进程都有自己的虚拟地址空间。
对32位进程来说,它有自己的4GB的地址空间。
对于64位进程来说,它有自己的16EB的地址空间。
进程中的各个线程运行时,它们只能访问属于该进程的内存。
线程即看不到其他进程的内存,也无法访问它们。
虚拟地址空间必须被映射到物理存储器上才能够被真正的使用。
虚拟地址空间的分区每个进程的虚拟地址空间被划分成许多分区。
地址分区依赖于操作系统的底层实现。
进程地址空间的划分分区x 86 32位Windows 3 GB用户模式下的x 86 32位Windows x 64空指针赋值分区0x000000000x000000000x00 0x0000FFFF0x0000FFFF0x00用户模式分区0x000100000x000100000x00 0x7FFEFFFF0xBFFEFFFF0x0064-KB禁入分区0x7FFF00000xBFFF00000x00 0x7FFFFFFF0xBFFFFFFF0x00内核模式分区0x800000000xC00000000x00 0xFFFFFFFF0xFFFFFFFF0xFF1.空指针赋值分区:这一分区是进程地址空间中从0x00000000~0x0000ffff的闭合区,保留这一分区是为了帮助程序员捕获对空指针的赋值。
没有任何办法可以让我们分配到这一地址区间内的虚拟内存,即使是Win32应用程序的编程接口也不行。
2.用户模式分区这一分区是进程地址空间的驻地。
对所有的应用程序来说,进程的大部分数据都保存在这一分区。
进程无法通过指针来读取,写入或以任何方式访问驻留在这一分区中其他进程的数据。
在Windows中,所有的.EXE和.DLL都载入到这一区域。
windows操作系统的框架结构Windows操作系统是一种广泛应用于个人电脑和服务器的操作系统,它的框架结构是指其整体的架构和组成部分。
本文将从不同的角度来介绍Windows操作系统的框架结构。
一、Windows操作系统的总体架构Windows操作系统的总体架构可以分为两个层次:用户模式和内核模式。
用户模式提供了用户与操作系统交互的接口,包括应用程序、用户界面等;而内核模式则是操作系统的核心,负责管理系统资源、提供系统服务等。
二、用户模式的组成1. 用户界面:Windows操作系统提供了直观友好的用户界面,包括桌面、任务栏、开始菜单等,方便用户进行操作。
2. 应用程序:用户可以通过应用程序来完成各种任务,例如办公软件、娱乐软件等。
Windows操作系统提供了丰富的应用程序开发接口,使得开发者可以开发各种各样的应用程序。
三、内核模式的组成1. 硬件抽象层(HAL):HAL是Windows操作系统的底层模块,负责与硬件设备进行交互,提供了一个对硬件的抽象接口,使得操作系统可以独立于硬件平台。
2. 内核:内核是操作系统的核心,提供了各种系统服务,例如进程管理、内存管理、文件系统等。
内核被分为多个模块,每个模块负责不同的功能。
3. 设备驱动程序:设备驱动程序是连接操作系统和硬件设备的桥梁,它负责将操作系统的请求转换为硬件设备可以理解的命令,从而实现对硬件设备的控制和管理。
四、进程管理1. 进程:进程是指正在运行的一个程序的实例,每个进程都有自己的地址空间和资源。
Windows操作系统使用进程来实现多任务,并提供了各种进程管理的功能,例如创建进程、终止进程、进程调度等。
2. 线程:线程是进程的执行单元,一个进程可以包含多个线程。
线程之间可以共享进程的资源,并且可以并发执行。
Windows操作系统提供了丰富的线程管理功能,例如创建线程、线程同步、线程调度等。
五、内存管理1. 虚拟内存:Windows操作系统使用虚拟内存来管理系统的内存资源,将物理内存和磁盘空间结合起来使用。
用VC写Assembly代码(6)--附录2[windows进程中的内存结构]2006-06-08 23:21 1096人阅读评论(0) 收藏举报在阅读本文之前,如果你连堆栈是什么多不知道的话,请先阅读文章后面的基础知识。
接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据。
那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论。
下文中的C语言代码如没有特别声明,默认都使用V C编译的r eleas e版。
首先,来了解一下C 语言的变量是如何在内存分部的。
C 语言有全局变量(Global)、本地变量(Local),静态变量(Static)、寄存器变量(Regeis ter)。
每种变量都有不同的分配方式。
先来看下面这段代码:#includ e <stdio.h>int g1=0, g2=0, g3=0;int main(){static int s1=0, s2=0, s3=0;int v1=0, v2=0, v3=0;//打印出各个变量的内存地址printf("0x%08x/n",&v1); //打印各本地变量的内存地址printf("0x%08x/n",&v2);printf("0x%08x/n/n",&v3);printf("0x%08x/n",&g1); //打印各全局变量的内存地址printf("0x%08x/n",&g2);printf("0x%08x/n/n",&g3);printf("0x%08x/n",&s1); //打印各静态变量的内存地址printf("0x%08x/n",&s2);printf("0x%08x/n/n",&s3);return 0;}编译后的执行结果是:0x0012ff780x0012ff7c0x0012ff800x004068d00x004068d40x004068d80x004068dc0x004068e00x004068e4输出的结果就是变量的内存地址。
Windows中进程的内存结构基础知识:堆栈是⼀种简单的数据结构,是⼀种只允许在其⼀端进⾏插⼊或删除的线性表。
允许插⼊或删除操作的⼀端称为栈顶,另⼀端称为栈底,对堆栈的插⼊和删除操作被称为⼊栈和出栈。
有⼀组CPU指令可以实现对进程的内存实现堆栈访问。
其中,POP指令实现出栈操作,PUSH指令实现⼊栈操作。
CPU的ESP寄存器存放当前线程的栈顶指针,EBP寄存器中保存当前线程的栈底指针。
CPU的EIP寄存器存放下⼀个CPU指令存放的内存地址,当CPU执⾏完当前的指令后,从EIP寄存器中读取下⼀条指令的内存地址,然后继续执⾏。
接触过编程的⼈都知道,⾼级语⾔都能通过变量名来访问内存中的数据。
那么这些变量在内存中是如何存放的呢?程序⼜是如何使⽤这些变量的呢?下⾯就会对此进⾏深⼊的讨论。
下⽂中的C语⾔代码如没有特别声明,默认都使⽤VC编译的release版。
⾸先,来了解⼀下 C 语⾔的变量是如何在内存分部的。
C 语⾔有全局变量(Global)、本地变量(Local),静态变量(Static)、寄存器变量(Register)。
每种变量都有不同的分配⽅式。
先来看下⾯这段代码:#include <stdio.h>int g1=0, g2=0, g3=0;int main(){static int s1=0, s2=0, s3=0;int v1=0, v2=0, v3=0;//打印出各个变量的内存地址printf("0x%08x\n",&v1); //打印各本地变量的内存地址printf("0x%08x\n",&v2);printf("0x%08x\n\n",&v3);printf("0x%08x\n",&g1); //打印各全局变量的内存地址printf("0x%08x\n",&g2);printf("0x%08x\n\n",&g3);printf("0x%08x\n",&s1); //打印各静态变量的内存地址printf("0x%08x\n",&s2);printf("0x%08x\n\n",&s3);return 0;}编译后的执⾏结果是:0x0012ff780x0012ff7c0x0012ff80(在BC++/TC++中结果是0x0012ff880x0012ff840x0012ff80这样,这就说明在BC++/TC++中变量地址是倒序存放的。
一、背景知识
Windows2000是32位的操作系统,它使计算机CPU可以用32位地址对32位内存块进行操作。
内存中的每一个字节都可以用一个32位的指针来寻址。
这样,最大的存储空间就是232字节或4000兆字节(4GB)。
这样,在Windows下运行的每一个应用程序都认为能独占可能的4GB大小的空间。
而另一方面,实际上没有几台机器的RAM能达到4GB,更不必说让每个进程都独享4GB内存了。
Windows在幕后将虚拟内存(Virtual Memory,VM)地址映射到了各进程的物理内存地址上。
而所谓物理内存是指计算机的RAM和由Windows分配到用户驱动器根目录上的换页文件。
物理内存完全由系统管理。
二、实验目的
1)通过实验了解Windows2000内存的使用,学习如何在应用程序中管理内存,体会Windows应用程序内存的简单性和自我防护能力。
2)了解Windows2000的内存结构和虚拟内存的管理,进而了解进程堆和Windows为使用内存而提供的一些扩展功能。
三、工具准备
在开始本实验之前,您需要做以下准备:
1)一台运行Windows 2000 Professional操作系统的计算机。
2)计算机中需安装Visual C++6.0专业版或企业版。
四、实验内容与步骤
Windows提供了一个API函数即GetSystemInfo(),以便用户能检查系统中虚拟内存的一些特性。
清单1显示了如何调用该函数以及显示系统中当前内存的参数。
步骤1:登录进入Windows 2000 Professional。
步骤2:在“开始”菜单中单击“程序-Microsoft Visual Studio 6.0–Microsoft Visual C++6.0”命令,进入VisualC++窗口。
步骤3:输入并编辑vmeminfo.cpp。
清单1获取有关系统的内存设置的信息
//工程vmeminfo
#include<windows.h>
#include<iostream>
#include<shlwapi.h>
#include<iomanip>
#pragmacomment(lib,"shlwapi.lib")
void main() {
//首先获得系统信息
SYSTEM_INFO si;
::ZeroMemory(&si,sizeof(si));
::GetSystemInfo(&si);
//使用外壳辅助程序对一些尺寸进行格式化
TCHAR szPageSize[MAX_PA TH];
::StrFormatByteSize(si.dwPageSize , szPageSize, MAX_PA TH);
DWORD dwMemSize=(DWORD)si.lpMaximumApplicationAddress-
(DWORD)si.lpMinimumApplicationAddress;
TCHAR szMemSize[MAX_PA TH];
::StrFormatByteSize(dwMemSize,szMemSize,MAX_PA TH);
//将内存信息显示出来
std::cout<<"Virtual Memory Page Size:"<<szPageSize<<std::endl;
std::cout.fill('0');
std::cout<<"Minimum application address:0x"<<std::hex
<<std::setw(8)<<(DWORD)si.lpMinimumApplicationAddress<<std::endl;
std::cout<<"Maximum application address:0x"<<std::hex<<std::setw(8)
<<(DWORD)si.lpMaximumApplicationAddress<<std::endl;
std::cout<<"Total available virtual memory: "<<szMemSize<<std::endl;
}
步骤4:单击“Build”菜单中的“Compile vmeminfo.cpp”命令,并单击“是”按钮确认。
系统对vmeminfo.cpp进行编译。
步骤5:编译完成后,单击“Build”菜单中的“Build vmeminfo.exe”命令,建立vmeminfo.exe 可执行文件。
操作能否正常进行?如果不行,则可能的原因是什么?
答:能正运行,运行结果如下:
步骤6:在工具栏单击“ExecuteProgram”(执行程序)按钮,执行vmeminfo.exe程序。
运行结果(如果运行不成功,则可能的原因是什么?):
1)虚拟内存每页容量为:__4.00k_________________________________
2)最小应用地址:_____0x00010000______________________________
3)最大应用地址:_____0x7ffeffff________________________________
4)当前可供应用程序使用的内存空间为:______1.99G______________
5)当前计算机的实际内存大小为:___________1.96G_____________ _
阅读和分析程序vmeminfo,请回答问题:
1)理论上每个Windows应用程序可以独占的最大存储空间是:____4G
2)在清单1程序中,用于检查系统中虚拟内存特性的API函数是:
_________GetSystemInfo()_________________________________
提示:可供应用程序使用的内存空间实际上已经减去了开头与结尾两个64KB的保护区。
虚拟内存空间中的64KB保护区是防止编程错误的一种Windows方式。
任何对内存中这一区域的访问(读、写、执行)都将引发一个错误陷井,从而导致错误并终止程序的执行。
也就是说,假如用户有一个NULL指针(地址为0),但仍试图在此之前很近的地址处使用另一个指针,这将因为试图从更低的保留区域读写数据,从而产生意外错误并终止程序的执行。
五、试验总结
(1)在本次的试验中了解了Windows的内存结构,通过程序的编程实验学习到了,通过调用函数库中的函数,
StrFormatByteSize() ZeroMemor() GetSystemInfo()等函数,
进一步了解了如何在应用程序中管理内存,体会Windows应用程序内存的简单性和自我防护能力。
2)了解Windows2000的内存结构和虚拟内存的管理,进而了解进程堆和Windows 为使用内存而提供的一些扩展功能。
3)根据虚拟技术,我们可以使的每个进程都认为自己独享4GB内存了。
Windows在幕后将虚拟内存(Virtual Memory,VM)地址映射到了各进程的物理内存地址上。
而所谓物理内存是指计算机的RAM和由Windows分配到用户驱动器根目录上的换页文件。
物理内存完全由系统管理,体验了虚拟技术的优越性。