关于windows的内存管理和申请

23 篇文章 0 订阅

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

 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春夜喜雨

稀罕你的喜欢!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值