繁体   English   中英

使用 AWE 分配内存

[英]Allocating memory using AWE

我正在使用启用了 PAE 和 8GB 物理内存的 32 位 Windows XP SP3。

我想要的只是使用 AWE 从黑暗面分配内存 - 即隐藏的 4GB - 所以我写了我Lock pages in memory然后我写了以下代码:

#include <windows.h>
#include <stdio.h>

BOOL EnableAWE();

int main()
{
    if(!EnableAWE())
    {
        printf("Can not enable AWE on this system.\n");
        return 1;
    }

    HANDLE hProcess = GetCurrentProcess();
    SIZE_T byts = ~0u >> 1;
    LPVOID ptr = VirtualAllocEx(hProcess, NULL, byts, MEM_PHYSICAL | MEM_RESERVE, PAGE_READWRITE);

    if (ptr == NULL)
    {
        printf("Allocation failed for requested memory size.\n");
        return 1;
    }

    VirtualFreeEx(hProcess, ptr, 0, MEM_RELEASE);

    return 0;
}

BOOL EnableAWE()
{
    HANDLE hToken = NULL;

    TOKEN_PRIVILEGES tp;
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    if(!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken)) return FALSE;
    if (!LookupPrivilegeValue(NULL, SE_LOCK_MEMORY_NAME, &(tp.Privileges[0].Luid))) return FALSE;
    if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) return FALSE;

    return TRUE;
}

函数EnableAWE始终返回 true,但是当我尝试使用VirtualProtect分配 2GB 时,它失败并显示错误代码 87,这意味着The parameter is incorrect.

我不知道哪个参数不正确。

谢谢。

嗯, VirtualAlloc不分配 AWE 内存。 AllocateUserPhysicalPages实际上分配内存。)它保留可以映射 AWE 内存的虚拟地址空间。 并且您的进程没有 2GB 的可用虚拟地址空间。

您发布的代码中没有调用 VirtualProtect。 另外,您是否使用 /LARGEADDRESSAWARE 进行编译?

无论如何,我怀疑即使使用 PAE,您也无法在 Win32 上获得 2GB 的连续地址空间。 尝试减少字节,看看是否有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM