windows的内存结构
1. 进程的地址空间分区
______________________________________________________________________________________________
| 分区 |32位windows2000 |32位windows2000 |64位windows2000 |windows98 |
| |(x86和Alpha处理器)|(x86 w/3 GB用户方式)|(Alpha和IA-64处理器)| |
|____________|__________________|____________________|____________________|__________________|
|NULL指针 |0x00000000 |0x00000000 |0x00000000 00000000 |0x00000000 |
|分配的分区 |0x0000FFFF |0x0000FFFF |0X00000000 0000FFFF |0x00000FFF |
|____________|__________________|____________________|____________________|__________________|
|DOS/16位 | | | |0x00001000 |
|windwos应用 | 无 | 无 | 无 |0x003FFFFF |
|程序兼容分区| | | | |
|____________|__________________|____________________|____________________|__________________|
|用户方式 |0x00010000 |0x00010000 |0x00000000 00010000 |0x00400000 |
| |0x7FFEFFFF |0xBFFEFFFF |0x000003FF FFFEFFFF |0X7FFFFFFF |
|____________|__________________|____________________|____________________|__________________|
|64KB禁止进入|0x7FFF0000 |0xBFFF0000 |0x000003FF FFFF0000 | 无 |
| |0x7FFFFFFF |0xBFFFFFFF |0x000003FF FFFFFFFF | |
|____________|__________________|____________________|____________________|__________________|
|共享内存映射| 无 | 无 | 无 |0x80000000 |
|文件(MMF) | | | |0xBFFFFFFF |
|____________|__________________|____________________|____________________|__________________|
|内核方式 |0x80000000 |0xC0000000 |0x00000400 00000000 |0xC0000000 |
| |0xFFFFFFFF |0xFFFFFFFF |0xFFFFFFFF FFFFFFFF |0xFFFFFFFF |
|____________|__________________|____________________|____________________|__________________|
______________________________________________________________________________________________
| 分区 |32位windows2000 |32位windows2000 |64位windows2000 |windows98 |
| |(x86和Alpha处理器)|(x86 w/3 GB用户方式)|(Alpha和IA-64处理器)| |
|____________|__________________|____________________|____________________|__________________|
|NULL指针 |0x00000000 |0x00000000 |0x00000000 00000000 |0x00000000 |
|分配的分区 |0x0000FFFF |0x0000FFFF |0X00000000 0000FFFF |0x00000FFF |
|____________|__________________|____________________|____________________|__________________|
|DOS/16位 | | | |0x00001000 |
|windwos应用 | 无 | 无 | 无 |0x003FFFFF |
|程序兼容分区| | | | |
|____________|__________________|____________________|____________________|__________________|
|用户方式 |0x00010000 |0x00010000 |0x00000000 00010000 |0x00400000 |
| |0x7FFEFFFF |0xBFFEFFFF |0x000003FF FFFEFFFF |0X7FFFFFFF |
|____________|__________________|____________________|____________________|__________________|
|64KB禁止进入|0x7FFF0000 |0xBFFF0000 |0x000003FF FFFF0000 | 无 |
| |0x7FFFFFFF |0xBFFFFFFF |0x000003FF FFFFFFFF | |
|____________|__________________|____________________|____________________|__________________|
|共享内存映射| 无 | 无 | 无 |0x80000000 |
|文件(MMF) | | | |0xBFFFFFFF |
|____________|__________________|____________________|____________________|__________________|
|内核方式 |0x80000000 |0xC0000000 |0x00000400 00000000 |0xC0000000 |
| |0xFFFFFFFF |0xFFFFFFFF |0xFFFFFFFF FFFFFFFF |0xFFFFFFFF |
|____________|__________________|____________________|____________________|__________________|
2.windows98的内核分区并没有受到保护,任何应用程序都可以访问内核分区,这将导致系统崩溃。
3.当进程被创建时,大部分可用地址空间是未分配或者空闲的
。可以调用VirtualAlloc函数来分配地址空间中的各个区域。当你保留地址空间的一个区域时,系统需要确保该区域从一个分配粒度的边界开始,并且
分配的大小为系统页面大小的整数倍。系统本身不受第一个规定约束。
4.若要使用已保留的地址空间区域,必须分配物理存储器,然后将该物理存储器映射到已保留的地址空间区域。这个过程称为提交物理存储器。物理存储器总是以页面的形式来提交的。若要将物理存储器提交给一个已保留的地址空间区域,也要调用VirtualAlloc函数。
5.。今天的操作系统能够使得磁盘空间看上去就像内存一样。磁盘上的文件通常称为页文件,它包含了可供所有进程使用的虚拟内存。
6.不在页文件中维护的物理存储器:
系统在运行一个程序的时候,并不为进程的代码和数据保留地址空间的一些区域,将物理存储器提交给这 些区域,然后将代码和数据从硬盘上的程序文件拷贝到页文件中已提交的物理存储器中。这样做速度太慢了,并且磁盘上的页文件会变成非常的大。相反,当启动一 个应用程序的时候,系统将打开该应用程序的.exe文件,确定该应用程序的代码和数据的大小。然后系统要保留一个地址空间的区域,并指明与该区域相关联的 物理存储器是.exe文件本身。这样可以使应用程序的加载非常快,并且可以使页文件能够保持非常小。当硬盘上的一个程序的文件映像(这是个.exe文件或 DLL文件)用作地址空间的区域的物理存储器时,它称为内存映射文件(memory-mapped file)。
系统在运行一个程序的时候,并不为进程的代码和数据保留地址空间的一些区域,将物理存储器提交给这 些区域,然后将代码和数据从硬盘上的程序文件拷贝到页文件中已提交的物理存储器中。这样做速度太慢了,并且磁盘上的页文件会变成非常的大。相反,当启动一 个应用程序的时候,系统将打开该应用程序的.exe文件,确定该应用程序的代码和数据的大小。然后系统要保留一个地址空间的区域,并指明与该区域相关联的 物理存储器是.exe文件本身。这样可以使应用程序的加载非常快,并且可以使页文件能够保持非常小。当硬盘上的一个程序的文件映像(这是个.exe文件或 DLL文件)用作地址空间的区域的物理存储器时,它称为内存映射文件(memory-mapped file)。
7.当CPU访问正确对齐的数据时,它的运行效率是最高的。当数据的内存地址模数据的大小为0时,数据就是对齐的。当CPU访问未对齐的数据
时,CPU可以执行两种操作,可以产生一个异常条件,也可以执行多次对齐的内存访问,以便读取完整的未对齐数据值。。X86
CPU的EFLAGS寄存器中包含一个特殊的位标志,称为AC(对齐检查的英文缩写)标志。按照默认设置,当CPU首次加电时,该标志被设置为0。当该标
志是0时,CPU能够自动执行它应该执行的操作,以便成功地访问未对齐的数据值。然而,如果该标志被设置为1,每当系统试图访问未对齐的数据时,CPU就
会发出一个INT 17H中断。
8.UINT SetErrorMode(UINT
fuErrorMode);关联的标志是SEM_NOALIGNMNTFAULTEXCEPT标志。修改该标志可以影响当前进程,但是不会影响其他进程。
无论在哪个CPU
平台上运行,都可以调用SetErrorMode函数,传递SEM_NOALIGNMENTFAULTEXCEPT标志。但是,结果并不总是相同。如果是
x86系统,该标志总是打开的,并且不能被关闭。如果是Alpha系统,那么只有当EnableAlignmentFault
Exceptions注册表值被设置为1时,才能关闭该标志。