`
wrf44wrf
  • 浏览: 14943 次
社区版块
存档分类
最新评论

windows内存结构

 
阅读更多

windows内存结构
2011年06月27日
  进程的虚拟地址空间
  每个进程都被赋予它自己的虚拟地址空间。对于32位进程来说,这个地址空间是4GB,(这是个虚拟地址空间,不是物理地址空间)。
  32位指针可以拥有从0x00000000至0xFFFFFFFF之间的任何一个值。这使得一个指针能够拥有4 294 967 296个值中的一个值,它覆盖了一个进程的4GB虚拟空间的范围。对于64位进程来说,这个地址空间是16EB(1018字节),
  64位指针可以拥有从0x0000000000000000至0xFFFFFFFFFFFFFFFF之间的任何值。这使得一个指针可以拥有18 446 744 073 709 551 616个值中的一个值,它覆盖了一个进程的16EB虚拟空间的范围。
  线程可以访问只属于它的进程的内存。属于所有其他进程的内存则隐藏着,并且不能被正在运行的线程访问
  每个进程有它自己的私有地址空间。进程A可能有一个存放在它的地址空间中的数据结构,地址是0x12345678,而进程B则有一个完全不同的数据结构存放在它的地址空间中,地址是0x1234567 8。当进程A中运行的线程访问地址为0x12345678的内存时,这些线程访问的是进程A的数据结构。当进程B中运行的线程访问地址为0x 12345678的内存时,这些线程访问的是进程B的数据结构。进程A中运行的线程不能访问进程B的地址空间中的数据结构。反之亦然。
  地址空间中的区域
  进程被创建并被赋予它的地址空间时,该可用地址空间的主体是空闲的(即未分配的)。若要使用该地址空间的各个部分,必须通过调用VirtualAlloc函数来分配它里边的各个区域。对一个地址空间的区域进行分配的操作称为保留操作( reserving )。
  每当你保留地址空间的一个区域时,系统要确保该区域从一个分配粒度的边界开始。对于不同的CPU 平台来说,分配粒度是各不相同的。目前的CPU 平台(x86 、32 位Alpha 、64 位Alpha 和IA-64 )都使用64KB 这个相同的分配粒度。
  当你保留地址空间的一个区域时,系统还要确保该区域的大小是系统的页面大小的倍数。页面是系统在管理内存时使用的一个内存单位。与分配粒度一样,不同的CPU ,其页面大小也是不同的。x86 使用的页面大小是4KB ,而Alpha (当既能运行32 位Windows 2000 也能运行64 位Windows 2000 时)使用的页面大小则是8KB 。如果想保留一个10 KB的地址空间区域,系统将自动对你的请求进行四舍五入,使保留的地址空间区域的大小是页面大小的倍数。
  当你的程序算法不再需要访问已经保留的地址空间区域时,该区域应该被释放。这个过程称为释放地址空间的区域,它是通过调用VirtualFree函数来完成的。
  在地址空间区域中提交物理存储器
  若要使用已保留的地址空间区域,必须分配物理存储器,然后将该物理存储器映射到已保留的地址空间区域。这个过程称为提交物理存储器。物理存储器总是以页面的形式来提交的(因为页面是系统在管理内存时使用的一个内存单位)。若要将物理存储器提交给一个已保留的地址空间区域,也要调用VirtualAlloc函数。 当程序算法不再需要访问保留的地址空间区域中已提交的物理存储器时,该物理存储器应该被释放。这个过程称为回收物理存储器,它是通过VirtualFree函数来完成的。 物理存储器与页文件
  磁盘上的文件通常称为页文件,它包含了可供所有进程使用的虚拟内存。
  进程中的一个线程试图访问进程的地址空间中的一个数据块时,将会发生两种情况(如图):
  
  在第一种情况中,线程试图访问的数据是在RAM 中。在这种情况下,CPU 将数据的虚拟内存地址映射到内存的物理地址中,然后执行需要的访问。
  在第二种情况中,线程试图访问的数据不在RAM 中,而是存放在页文件中的某个地方。
  试图访问就称为页面失效, CPU将把试图进行的访问通知操作系统。这时操作系统就寻找RAM中的一个内存空页。
  如果找不到空页,系统必须释放一个空页。
  如果一个页面尚未被修改,系统就可以释放该页面。
  但是,如果系统需要释放一个已经修改的页面,那么它必须首先将该页面从RAM拷贝到页交换文件中,然后系统进入该页文件,找出需要访问的数据块,并将数据加载到空闲的内存页面。然后,操作系统更新它的用于指明数据的虚拟内存地址现在已经映射到R A M中的相应的物理存储器地址中的表。这时CPU重新运行生成初始页面失效的指令,但是这次CPU能够将虚拟内存地址映射到一个物理RAM地址,并访问该数据块。
  注意:系统需要将内存页面拷贝到页文件并反过来将页文件拷贝到内存页面的次数越多,你的硬盘倒腾的次数就越多,系统运行得越慢(抖动)。  内存映射文件(不在页文件中维护的物理存储器) 当启动一个应用程序的时候,系统将打开该应用程序的.exe 文件,确定该应用程序的代码和数据的大小。然后系统要保留一个地址空间的区域,并指明与该区域相关联的物理存储器是在.exe 文件本身中。即系统并不是从页文件中分配地址空间,而是将.exe 文件的实际内容即映像用作程序的保留地址空间区域。当然,这使应用程序的加载非常迅速,并使页文件能够保持得非常小。
  当硬盘上的一个程序的文件映像(这是个.exe文件或DLL文件)用作地址空间的区域的物理存储器时,它称为内存映射文件。当一个. exe文件或DLL文件被加载时,系统将自动保留一个地址空间的区域,并将该文件映像映射到该区域中。
  数据对齐的重要性
  数据对齐并不是操作系统的内存结构的一部分,而是CPU结构的一部分。
  当C P U访问正确对齐的数据时,它的运行效率最高。当数据大小的数据模数的内存地址是0时,数据是对齐的。例如, W O R D值应该总是从被2除尽的地址开始,而D W O R D值应该总是从被4除尽的地址开始,如此等等。
  保护属性
  已经分配的物理存储器的各个页面可以被赋予不同的保护属性。
  保护属性 描述 PAGE_NOACCESS 如果试图在该页面上读取、写入或执行代码,就会引发访问违规 PAGE_READONLY 如果试图在该页面上写入或执行代码,就会引发访问违规 PAGE_READWRITE 如果试图在该页面上执行代码,就会引发访问违规 PAGE_EXECUTE 如果试图在该页面上对内存进行读取或写入操作,就会引发访问违规 PAGE_EXECUTE_READ 如果试图在该页面上对内存进行写入操作,就会引发访问违规 PAGE_EXECUTE_READWRITE 对于该页面不管执行什么操作,都不会引发访问违规 PAGE_WRITECOPY 如果试图在该页面上执行代码,就会引发访问违规。如果试图在该页面上写入内存,就会导致系统将它自己的私有页面(受页文件的支持)拷贝赋予该进程 PAGE_EXECUTE_WRITECOPY 对于该地址空间的区域,不管执行什么操作,都不会引发访问违规。如果试图在该页面上的内存中进行写入操作,就会将它自己的私有页面(受页文件的支持)拷贝赋予该进程 当使用 VirtualAlloc 函数来保留地址空间或者提交物理存储器时,不应该传递 PAGE_WRITECOPY 
  或 PAGE_EXECUTE_READWRITE 。如果传递的话,将会导致 VirtualAlloc 调用的失败。对 GetLastError 的调用将返回 ERROR_INVALID_PARAMETER 。当操作系统映射 .exe 或 DLL 文件映像时,这两个属性将被操作系统使用。
分享到:
评论

相关推荐

    Windows内存体系结构

    Windows操作系统内存体系结构详细介绍。

    windows进程中的内存结构

    windows进程中的内存结构,涵盖知识点多,讲解详细,适合C/C++开发人员学习

    Windows 2000内存结构

    Windows 2000是32位的操作系统,它使计算机CPU可以用32位地址对32位内存块进行操作。内存中的每一个字节都可以用一个32位的指针来寻址。这样,最大的存储空间就是232字节或4000兆字节 (4GB) 。这样,在Windows下运行...

    实验五、Windows 2000内存结构.doc

    实验五、Windows2000内存结构1背景知识Windows2000是32位的操作系统,它使计算机CPU可以用32位地址对32位内存块进行操作。内存中的每一个字节都可以用一个32位的指针来寻址,这样,最大的存储空间就是232字节或4000...

    WindowsCE内存查看工具

    该工具可以用来查看系统的总内存及当前可用内存情况,便于系统评估及软件开发,运行平台ARMV4,ARMVRI+WINCE

    基于Windows的存储器管理实验报告

    通过实验,使学生了解Windows内存结构和虚拟内存的管理,学习如何在应用程序中管理内存。 (1)为应用程序分配内存空间; (2)检测内存的使用情况; (3)显示每个虚拟内存区域的特性; (4)内存区域的保护; 内存...

    论文研究-基于KPCR结构的Windows物理内存分析方法.pdf

    介绍了计算机在线取证方式的优势,总结了目前国外在计算机物理内存分析的研究现状及其存在的不足,在此基础上提出了一种新的Windows物理内存分析方法——基于KPCR结构的物理内存分析方法。与传统的物理内存方法相比...

    内存管理作业C++ 提供两个版本:windows平台和linux平台下运行

    7 程序的结构化模块化清晰 6 详细的源代码注释 编程要点: 1 详细见源代码和注释 2 算法难点(1) 将空闲分区链表和占用分区链表按地址顺序合并显示 3 算法难点(2) 提供最先分配和最优分配两种算法,逻辑控制较复杂

    windowsnt 技术内幕

    怎样准备70-073考试 理解工作站与客户端 理解为什么要参加70-073测试 理解Windows NT体系结构 深入理解用户模式内核模式 Windows NT Executive简介 理解Windows NT内存模型的优点 理解中央管理的优点 登录到Windows ...

    redis-windows-7.0.11

    Redis是一种开源的内存数据结构存储系统,它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。Redis可以用作数据库、缓存和消息中间件。Redis在性能、可扩展性和灵活性方面表现出色,因此被广泛应用于Web...

    深入解析WINDOWS操作系统(第4版).pdf

    内容简介 ...观察Windows如何管理虚拟内存和物理内存;理解NTFS的操作和格式,诊断文件系统访问问题;从上往下查看 Windows的网络栈,包括映射、API、名称解析和协议驱动程序;诊断引导问题,执行崩溃分析

    屏幕取词原理与实现

    文章描述了通过截获系统API实现 Windows NT内核屏幕取词的方法。以一个屏幕取词应用的具体实现为主线, 对实现屏幕取词的关键...其中涉及的相关技术有Windows内存结构与管理、设备上下文、动态链接库和Windows挂钩等。

    内存管理内存管理内存管理

    返回的每块内存的起始处首先要有这个结构: 清单 3. 内存控制块结构定义 struct mem_control_block { int is_available; int size; }; 现在,您可能会认为当程序调用 malloc 时这会引发问题 —— 它们...

    windows internals 7th-2; windows 内核数据结构;内核编程参考;英文PDF转word原版

    本内容含windows内核数据结构,常用工具介绍900页,待后续转换中英双语版本; * 使用 Dependency Walker 工具查看从 Windows 子系统 DLL 导出的函数。从 http://www.dependencywalker.com 下载 Dependency Walker ...

    内存管理技术内幕

    Windows NT所面对的最复杂和困难的任务之一就是要管理好计算机上有限的物理内存。NT必须为可能同时运行的多个进程划分物理内存以提供给每个进程适当的一份的事实更加强了这个挑战。此外,NT还必须能在一个从少到16MB...

    WINDOWS 内部原理 (八)

    如果能够深入了解Windows内存管理机制,那么无论在系统配置还是在故障排错方面,都能让我们直达根源,起到事半功倍的效果。本课程将全面介绍Windows内部内存管理机制,包括寻址原理、进程内存空间分布、核心态用户态...

    使用内存映射数据文件

    Windows提供了3种进行内存管理的方法: • 虚拟内存,最适合用来管理大型对象或结构数组。 • 内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行的多个进程之间共享数据。 • ...

    建立基于内存的文件系统

    为该文件系统设计相应的数据结构来管理目录、虚拟磁盘的空闲空间、已分配空间等。 提供文件的创建、删除、移位、改名等功能。 提供良好的界面,可以显示磁盘文件的状态和空间的使用情况; 提供虚拟磁盘转储功能,可...

    深入解析Windows操作系统中文.part2.rar

    本书是著名的操作系统内核专家Mark Russinovich和David Solomon撰写的Windows操作系统原理的最新版著作,全面和深入地阐述了Windows操作系统的整体结构以及内部工作细节。本书针对Windows Server 2003、Windows XP...

Global site tag (gtag.js) - Google Analytics