Ответ 1
слепое применение флага LargeAddressAware
к вашему 32-битовому исполняемому файлу развертывает тиковую бомбу замедленного действия!
установив этот флаг, который вы подтверждаете ОС:
да, мое приложение (и все DLL, загружаемые во время выполнения) может справиться с адресами памяти до 4 ГБ.
поэтому не ограничивайте VAS для процесса до 2 ГБ, а разблокируйте весь диапазон (4 ГБ) ".
но можете ли вы действительно гарантировать? вы берете на себя ответственность за все системные DLL, распространяемые компоненты microsoft и сторонние модули, которые может использовать ваш процесс?
обычно, распределение памяти возвращает виртуальные адреса в низком-высоком порядке. поэтому, если ваш процесс не потребляет много памяти (или имеет очень фрагментированное виртуальное адресное пространство), он никогда не будет использовать адреса за пределами границы 2 ГБ. это скрывает ошибки, связанные с высокими адресами.
если такие ошибки существуют, их трудно идентифицировать. они будут спорадически появляться "рано или поздно". это просто вопрос времени.
К счастью, в ОС Windows есть чрезвычайно удобный общесистемный коммутатор:
для целей тестирования используйте параметр реестра MEM_TOP_DOWN.
это заставляет все распределения памяти идти сверху вниз, вместо нормального снизу вверх.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
"AllocationPreference"=dword:00100000
(это hex 0x100000. требуется перезагрузка Windows, конечно)
с включенным коммутатором вы будете идентифицировать проблемы "скорее", а не "позже". в идеале вы увидите их "с самого начала".
Примечание: для первого анализа я настоятельно рекомендую инструмент VMmap
(SysInternals).
выводы:
при применении флага LAA к вашему 32-битовому исполняемому файлу необходимо полностью протестировать его на ОС x64 с помощью набора TopDown AllocationPreference
.
для проблем в вашем собственном коде, вы можете исправить их.
просто назвать один очень очевидный пример: используйте целые числа без знака вместо целых чисел со знаком для указателей на память.
когда вы сталкиваетесь с проблемами с сторонними модулями, вам нужно попросить автора исправить свои ошибки. если это не сделано, лучше удалить флаг LargeAddressAware из исполняемого файла.
примечание к тестированию:
переключатель реестра MemTopDown не достигает желаемых результатов для модульных тестов, которые выполняются "тестовым runner", который сам не поддерживает LAA.
см. Тестирование устройств для совместимости с x86 LargeAddressAware
PS:
также очень "родственный" и довольно интересный переход от 32-битного кода к 64-битной.
для примеров см.
- Как программист, что мне нужно беспокоиться при переходе в 64-битные окна?
- https://www.sec.cs.tu-bs.de/pubs/2016-ccs.pdf (в два раза больше бит, в два раза больше проблем)