2012-07-06 64 views
1

我正在使用啓用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.

我不知道哪個參數不正確。

謝謝。

+0

您分配的字節數不是頁面大小的倍數。首先調用'GetSystemInfo'。 – 2012-07-06 00:50:05

+0

操作系統會將字節四捨五入到頁面大小,這就是MSDN所說的。 – 2012-07-06 00:53:38

+1

我以爲32位上的大內存僅限於服務器版的操作系統 – 2012-07-06 08:34:04

回答

1

恩,VirtualAlloc不分配AWE內存。 (AllocateUserPhysicalPages實際上分配了內存。)它保留可以映射AWE內存的虛擬地址空間。而且你的進程沒有2GB的可用虛擬地址空間。

0

在您發佈的代碼中沒有對VirtualProtect的調用。另外,你是用/ LARGEADDRESSAWARE編譯的嗎?

無論如何,我懷疑你在Win32上無法獲得2GB的連續地址空間,即使使用PAE也是如此。嘗試減少字數,看看是否有幫助。

+0

/LARGEADDRESSAWARE不會在32位操作系統上更改任何內容,除非操作系統使用/ 3GB引導 – 2012-07-06 08:30:54