[置顶] 关于windows的内存管理和申请

参考:《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>

LONG ThrowSEH(PEXCEPTION_POINTERS pExcepInfo )
{
    // 丢弃掉异常
    return 1;
}


int _tmain(int argc, _TCHAR* argv[])
{
    // 申请虚拟内存地址
    int* pAddressBottom = (int*)(VirtualAlloc(0, 1024 * sizeof(int), MEM_RESERVE, PAGE_READWRITE));   
    // 申请虚拟内存地址(从上部申请内存地址),并调拨物理内存
    int* pAddressTop    = (int*)(VirtualAlloc(0, 1024 * sizeof(int), MEM_RESERVE|MEM_TOP_DOWN|MEM_COMMIT, PAGE_READWRITE));
    __try
{
        // 访问会抛出SEH异常
        pAddressBottom[0] = 0;
    }
    __except(ThrowSEH(GetExceptionInformation()))
    {
        // 异常抛出后,为内存空间调拨物理内存
        VirtualAlloc(pAddressBottom, 1024 * sizeof(int), MEM_COMMIT, PAGE_READWRITE); 
    }
    __try
    {
        // 均正常访问
        pAddressBottom[0] = 0;
        pAddressTop[0] = 0;
    }
    __except(ThrowSEH(GetExceptionInformation()))
    {
        // 未抛出异常
    }
    
    return 0;
}


 

  

注意事项:

调测程序的时候使用#include “windows.h”

否则会报错:winnt.h(5547) : error C2146: 语法错误 : 缺少“;”(在标识符“ContextRecord”的前面)  



(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

 




你可能感兴趣的:([置顶] 关于windows的内存管理和申请)