windows 32bit操作系统 进程地址空间可用地址区域一般是 0x00010000->0x7FFEFFFF。总共2G.进程无法通过指针来读取、写入或以任何方式,访问驻留在这一分区中的其他进程的数据。
另外,内核模式分区范围是:0x80000000->0xFFFFFFFF 也是2G.这一分区是操作系统代码的驻地,与线程调度、内存管理、文件系统支持、网络支持以及设备驱动程序相关的代码都载入到该分区。在这一分区内的任何东西为所有进程共有。
所以,在32位系统中,内核对象的内容被保存在0x80000000至0xFFFFFFFF的这个内核地址空间中)
好像暂时这样理解:
1.页交换文件,它是在硬盘c空间上的pagefile.sys。
在从微软的官方文档来看,“虚拟内存”
等于“物理内存”+“分页文件”
总和。应该指的是大小对应的关系。
2.内存映射文件来自于硬盘其他文件,如exe文件,而不是页交换文件。
3种对内存操控的机制
1.虚拟内存
2.堆
3.内存映射文件:把一个程序位于硬盘上的文件映像(即一个exe或者dll文件)用作地址空间区域对应的物理存储器时,称这个文件映像为内存映射文件。
虚拟内存使用硬盘只能是页面文件,而内存映射使用的磁盘部分可以是任何磁盘文件
虚拟内存
预订地址空间 :virtualAlloc 函数
LPVOID lpAddress, // 要分配的内存区域的地址
DWORD dwSize, // 分配的大小
DWORD flAllocationType, // 分配的类型
DWORD flProtect // 该内存的初始保护属性
}
lpAddress:可以为null,系统将会决定分配内存区域的位置,并且按64-KB向上取整(roundup),
必须是进程的用户模式分区的地址,
dwSize:这个参数以字节为单位,真实情况会是:页面大小(一般是4k)的整数倍
flAllocationType:
可以是MEM_COMMIT(为指定地址空间提交物理内存)调拨 是从页交换文件调拨
MEM_RESERVE保留指定地址空间,不分配物理内存)预订
MEM_TOP_DOWN(在尽可能高的地址分配内存。)
DWORD flProtect 可以是PAGE_READWRITE
VirtualFree
LPVOID lpAddress, // 区域地址
SIZE_T dwSize, // 区域大小,字节 可以是0
DWORD dwFreeType // 类型 MEM_RELEASE 释放指定页,如果指定了这个类型,则dwSize应设置为0
进程的虚拟地址空间类型:
1.闲置
2.私有:以页交换文件为后备存储器 比如虚拟内存
3.映像:以映像文件(exe或dll)为后备存储器
4.已映射:以内存映射文件为后备存储器
还是区分不清映像和已映射。