我正在使用啓用PAE和8GB物理內存的32位Windows XP SP3。使用AWE分配內存
所有我想要的是使用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.
我不知道哪個參數不正確。
謝謝。
您分配的字節數不是頁面大小的倍數。首先調用'GetSystemInfo'。 – 2012-07-06 00:50:05
操作系統會將字節四捨五入到頁面大小,這就是MSDN所說的。 – 2012-07-06 00:53:38
我以爲32位上的大內存僅限於服務器版的操作系統 – 2012-07-06 08:34:04