参考:《windows核心编程》
参考:百度知道
参考:http://bbs.pediy.com/showthread.php?t=173853
参考:http://blog.csdn.net/kevin_ut/article/details/6234239
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
windows的内存管理:
对于win32程序,应用程序自己申请的内存地址空间大小为2G – 128k
地址空间 |
说明 |
大小 |
备注 |
0x0000 0000 – 0x0000 FFFF |
NULL指针区域Region |
64k |
|
0x0001 0000 – 0x7FFE FFFF |
应用程序地址空间 |
~2G |
2G – 128k |
0x7FFF 0000 – 0x7FFF FFFF |
禁入区域Region |
64k |
|
0x8000 0000 – 0xFFFF FFFF |
内核地址空间 |
2G |
|
每个进程在执行的过程中,都会拥有这么大的虚拟地址空间。
这些地址空间,细分的话,会分为Region->Block->Page
Region:区域
Block:区域中的块,一个区域可以有1个以上的块
Page:页面大小一般是 4k (IA64的页面大小是8k)
内存分配有几个中间状态:
1. 虚拟内存地址未分配
2. 虚拟内存地址空间分配
3. 物理地址空间调拨给虚拟内存地址
内存地址空间分配后,如果没有调拨物理地址,访问时,会抛出SEH (Structed Exception Handle)异常:此时可以捕捉SEH异常,并调拨物理地址空间给改内存地址,然后继续访问。
下面例子:
程序申请了内存地址:一个从低地址申请,一个从高地址申请
pAddressBottom 0x00030000
pAddressTop 0x7ef90000
pAddressBottom[0]访问会抛出SHE异常,原因时内存没有调拨物理内存;
pAddressTop[0]访问没有问题,MEM_COMMIT参数确保了已调拨物理内存。
#include <windows.h>
|
注意事项:
调测程序的时候使用#include “windows.h”
否则会报错:winnt.h(5547) : error C2146: 语法错误 : 缺少“;”(在标识符“ContextRecord”的前面)
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)