Wine에서 32비트 응용 프로그램용 LAA(Large Address Awareness)가 어떻게 지원되는지 명확히 설명할 수 있는 사람이 있습니까?
Windows에서 32비트 응용 프로그램의 최대 RAM 제한은 기본적으로 2GB이지만 실행 파일에 LAA 플래그를 설정하여 최대 4GB까지 사용할 수 있다는 것을 알고 있습니다.
제가 이해한 바에 따르면 Wine은 기본적으로 32비트 Windows 응용 프로그램에 대해 2GB 제한을 준수하며 .exe에 LAA 플래그가 설정된 경우 4GB를 허용합니다. 그러나 모든 32비트 Windows 응용 프로그램이 자동으로 4GB LARGE_ADDRESS_AWARE=1
(또는 이와 유사한 것)를 사용하도록 Wine에 설정할 수 있는 전역 옵션도 있다고 들었습니다.
이것이 올바른 환경 변수인지 누군가가 명확히 할 수 있습니까? 바닐라 와인에도 적용되나요, 아니면 와인 스테이징에만 적용되나요? 64비트 Wine 접두사에서 32비트 응용 프로그램을 실행할 때도 필요합니까? Wine User Guide 페이지가 있다고 생각했는데 찾을 수 없었습니다.
답변1
WINE에서 실행하려는 모든 x86 응용 프로그램에 대한 패치를 설치할 수 있습니다. 패치는 여기에서 찾을 수 있습니다.https://ntcore.com/?page_id=371
또한 PE 파일에 LAA 플래그를 설정하기 위한 WINE 패치가 있습니다. github에 포함된 파일 내용을 보면, 찾고 계신 변수가 맞는 것 같습니다LARGE_ADDRESS_AWARE
https://github.com/randomstuff/pe-set-laa. 이 패치 작성자에 따르면 WINE에서는 잘 작동한다고 합니다.
실행하려는 항목(게임 또는 휴대용 실행 파일)에 따라 일부 응용 프로그램의 플래그 유효성에 약간의 불일치가 있는 것 같습니다.
소스에서 Wine을 빌드하려면 이 코드를 사용하여 LAA를 전역적으로 패치할 수도 있습니다.
diff --git a/dlls/kernel32/heap.c b/dlls/kernel32/heap.c
index cac73ec..fb214b9 100644
--- a/dlls/kernel32/heap.c
+++ b/dlls/kernel32/heap.c
@@ -1423,6 +1423,7 @@ VOID WINAPI GlobalMemoryStatus( LPMEMORYSTATUS lpBuffer )
/* values are limited to 2Gb unless the app has the IMAGE_FILE_LARGE_ADDRESS_AWARE flag */
/* page file sizes are not limited (Adobe Illustrator 8 depends on this) */
+/*
if (!(nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE))
{
if (lpBuffer->dwTotalPhys > MAXLONG) lpBuffer->dwTotalPhys = MAXLONG;
@@ -1430,7 +1431,7 @@ VOID WINAPI GlobalMemoryStatus( LPMEMORYSTATUS lpBuffer )
if (lpBuffer->dwTotalVirtual > MAXLONG) lpBuffer->dwTotalVirtual = MAXLONG;
if (lpBuffer->dwAvailVirtual > MAXLONG) lpBuffer->dwAvailVirtual = MAXLONG;
}
-
+*/
/* work around for broken photoshop 4 installer */
if ( lpBuffer->dwAvailPhys + lpBuffer->dwAvailPageFile >= 2U*1024*1024*1024)
lpBuffer->dwAvailPageFile = 2U*1024*1024*1024 - lpBuffer->dwAvailPhys - 1;
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 4d4bc3b..2c2264c 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -1845,7 +1845,7 @@ void virtual_set_large_address_space(void)
{
IMAGE_NT_HEADERS *nt = RtlImageNtHeader( NtCurrentTeb()->Peb->ImageBaseAddress );
- if (!(nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE)) return;
+ // if (!(nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE)) return;
/* no large address space on win9x */
if (NtCurrentTeb()->Peb->OSPlatformId != VER_PLATFORM_WIN32_NT) return;