首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解VirtualAlloc中的基址

理解VirtualAlloc中的基址
EN

Stack Overflow用户
提问于 2020-06-03 13:52:15
回答 1查看 883关注 0票数 1

在我的应用程序中,我试图在启动时通过VirtualAlloc分配一个很大的内存块(大约1GB-2GB),然后我可以在应用程序的其余部分中使用该内存块。在调试模式下,我希望在VirtualAlloc调用中传递一个基址,以保持指针地址的一致性,以便于调试,但我很难理解什么是我可以使用的有效基址。

下面是进行分配的代码片段

代码语言:javascript
复制
s32 CALLBACK WinMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR cmdLine, s32 showCode)
{
    SYSTEM_INFO info = {};
    GetSystemInfo(&info);

    // In my case info.lpMinimumApplicationAddress gives me 64kb
    LPVOID base = info.lpMinimumApplicationAddress;
    u32 totalSize = MEGABYTES(8);
    void *test = VirtualAlloc(base, totalSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

    ...
}

该应用程序是在64位版本的x86上运行的,根据我发现的以下信息:https://www.tenouk.com/WinVirtualAddressSpace.html

仅为应用程序保留的虚拟内存空间应该从4MB到2GB不等。但是,当我尝试分配少量内存时,比如在上面的代码片段中,基本地址为64 4MB (由系统信息提供),或者按照引用的网站在4MB左右分配,VirtualAlloc返回0。我尝试使用VirtualQueryEx来研究虚拟内存空间,我能找到的最大内存块的大小约为2GB,但基本地址为2GB。根据上面的信息,这意味着我在分配给系统内存,这可能是潜在的危险?

因此,简单地说,我想知道是否有人能澄清我在该网站上所指的信息是否准确,以及是否使用1GB或2GB的大基址是安全的?对于解决方案,我唯一的想法是扫描足够大的块的虚拟地址空间,并使用我找到的第一个块作为基址,但我不确定该基址在连续运行期间是否会保持一致,以便进行调试。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-03 14:06:49

链接的文章是32位模式.在64位模式下,保留地址从128 TB开始.下面是MSDN说关于它的内容:

对于32位进程,虚拟地址空间通常是2G范围从0x00000000到0x7FFFFFFF。对于64位Windows上的64位进程,虚拟地址空间为128 the范围0x000'00000000到0x7FFF‘’FFFFFFFF.虚拟地址的范围有时称为虚拟内存的范围。有关更多信息,请参见内存和地址空间限制

所以你很安全。

但是您根本不应该关心或探索基本地址--只需将NULL作为基地址,VirtualAlloc就会为您选择一个:

lpAddress 要分配的区域的起始地址。如果要保留内存,则将指定地址舍入到分配粒度的最近倍数。。。。如果此参数为NULL**,,则系统将确定分配该区域的位置。**

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62174578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档