Використання більш 2гб пам'яті для 32-бітного додатки
- архітектура x86
- x86 і x64 операційні системи
- Обмеження віртуальної пам'яті в Windows
- Функція настройки пам'яті 4GT
- прапор IMAGE_FILE_LARGE_ADDRESS_AWARE
- 4GB Patch
- CFF Explorer
- EDITBIN.EXE
- висновок
Сьогодні я розповім про обмеження віртуального адресного простору Windows і про те, як боротися з помилками «Недостатньо пам'яті», що виникають у 32-бітних програм та ігор, коли обсяг використовуваної ними пам'яті досягає 2 Гігабайт. Кілька простих способів обійти це обмеження і змусити додатки використовувати більш 2ГБ пам'яті.
Для початку трохи теорії про архітектуру процесорів і операційних систем, так як саме ці фактори визначають кількість пам'яті доступне для додатків. Тим, кому теоретична частина не цікава, можете відразу перейти до опису рішення проблеми .
архітектура x86
Всі сучасні десктоп процесори Intel або AMD (і не тільки) засновані на x86 архітектурі, яка була вперше реалізована в процесорах Intel 8086, що вийшли в 1978 році. Аж до Intel 80386 (i386) процесори були 16-bit і могли використовувати лише до 16 MB ОЗУ. Що вийшли в 1985 році i386 процесори стали 32-bit, що дає можливість адресації до 4 GB оперативної пам'яті (до 64 GB в режимі PAE, але при цьому додатки можуть використовувати так само тільки до 4 GB).
Ясна річ, що в ті роки 4 GB виглядало практично недосяжним. Але ніщо не стоїть на місці і з часом цього виявилося мало. У 2003 році компанія AMD (ага, вже не Intel) в своїх нових процесорах лінійки Opteron впровадила розширення x86-64 (інші назви: AMD64, Intel64, x64, EM64T). Це розширення мало ряд поліпшень: 64 бітні основні регістри, додаткові регістри та розширення адресного простору. Поточна реалізація дозволяє використовувати до 256 TB віртуального адресного простору, при теоретичному максимумі в 16 EB (ExbiByte - 264 байт). Процесори Intel підтримують розширення x86-64 (AMD64) зі старших моделей Pentium 4 (Prescott і далі).
x86 і x64 операційні системи
Застосовується до ОС (Операційні Системи) використовується позначення x86 (в побуті часто позначається як x32) і x64, що є 32-розрядними і 64-розрядними відповідно. Їх відмінність в тому, що x64 підтримують AMD64, даючи можливість використовувати його переваги, а x86 його не підтримує (і не використовує). На практиці це дає певні особливості і обмеження.
- 64-розрядна ОС вимагає процесора з підтримкою AMD64 (всі сучасні процесори від Intel або AMD)
- 32 розрядна ОС може працювати, як на процесорі з підтримкою AMD64, так і без неї (але таку старовину ще знайти потрібно)
- 64-розрядні додатки працюють тільки на 64-розрядної ОС
- 32-розрядні додатки повноцінно працюють і на x32 і на x64 ОС, але переваг AMD64 вони використовувати не можуть
На даний момент йде поступова відмова від x86 операційних систем на користь x64. Наприклад, серверні версії Windows, починаючи з 2008 R2, випускаються тільки 64-розрядними. Те ж Microsoft часто загрожують зробити і для нових десктопних версій, але поки не роблять.
Обмеження віртуальної пам'яті в Windows
У кожної версії Windows є певні обмеження щодо використання фізичної і віртуальної пам'яті (можна подивитися по засланні ). І якщо обмеження фізичної пам'яті пов'язано, скоріше, з ліцензуванням, то з обмеженнями віртуальної все трохи складніше.
Нас же цікавить тільки віртуальна пам'ять, так як саме з нею взаємодіють додатки. Якщо не вдаватися в подробиці, то технологія віртуальної пам'яті дозволяє кожному процесу мати свою власну пам'ять - адресний простір, яке віртуально не перетинається з адресними просторами інших процесів. Тобто додаток «вважає», що пам'ять належить тільки йому одному і може навіть використовувати більше наявного обсягу фізичної ОЗУ, а вже розподілом і узгодженням займається ОС.
І так, для 32-розрядних Windows загальне обмеження віртуальної пам'яті - 4 GB (як і для 32-розрядних процесорів). 64-розрядні мають обмеження від 15 до 256 TB в залежності від версії. Але, будь-яка редакція Windows ділить загальний адресний простір на дві частини: user mode (призначений для користувача режим) - пам'ять, доступна додаткам і kernel mode (режим ядра) - пам'ять, яка використовується системою. І, якщо на х64 додатків дістається 8 - 128 GB, то для x32 це всього лише 2 GB (фактично ~ 1.7-1.8 GB). При досягненні цього ліміту, додаток видасть помилку і буде закрито, або просто «вилетить» без будь-яких попереджень.
Як влаштована пам'ять в Windows, детально розписано в статтях Марка Руссиновича.
Функція настройки пам'яті 4GT
Для Windows x86 існує офіційний «милиця», що дозволяє перерозподілити віртуальну пам'ять, даючи додатків до 3 GB, при цьому зменшуючи системне простір до 1 GB. називається це 4-Gigabyte Tuning . Як це виглядає, продемонструвати на такій схемі (зліва - по-замовчуванню, праворуч - із застосуванням 4GT):
Чи включається опція наступним чином:
Для Windows XP / 2003 - додаванням ключа / 3GB у файлі Boot.ini
Для Windows Vista / 7/8 - команда BCDEdit / set increaseuserva 3072 (Пуск> Стандартні (Start> Accessories), правою кнопкою по Командний рядок (Command Prompt) - Запуск від імені адміністратора (Run as Administrator), ввести і запустити команду).
Включення цієї опції може привести до некоректної роботи деяких драйверів, програм або Windows в цілому.
прапор IMAGE_FILE_LARGE_ADDRESS_AWARE
Дозволяє програмі використовувати понад 2 GB віртуального адресного простору, тільки якщо воно скомпільовано з параметром IMAGE_FILE_LARGE_ADDRESS_AWARE. Всі 64-розрядні додатки за замовчуванням мають цей параметр (в цьому їх суть), а ось 32-розрядні можуть мати його або не мати - тут все залежить від програміста, який поставив цю опцію при компіляції або не поставив.
Цей прапор - це те, що нам потрібно, щоб змусити 32 бітове додаток використовувати більше 2 GB пам'яті. Запуск такого 32-bit додатки на Windows x32 із застосуванням 4GT дасть йому до 3 GB пам'яті (фактично ~ 2.8 GB), а на Windows x64 все 4 GB.
На щастя, виставити цей прапор для будь-якої програми можна самостійно. Для цього є кілька способів.
Перед тим, як приступити переконайтеся, що додаток, яке ви хочете змінити, в даний момент закрито.
4GB Patch
Найпростіший спосіб.
Для початку скачайте програму з сайту учасника або звідси:
Після запуску 4gb_patch.exe відкриється стандартне діалогове вікно «Відкриття файлу», де вам потрібно вказати .EXE файл, який ви збираєтеся змінити.
Відразу після вибору файлу з'явиться вікно програми, підтверджуючи успішну операцію. Далі ви можете змінити інший файл (натиснувши Another File) або закрити програму (натиснувши OK).
Майте у вигляді, що у програми не мають зворотної дії, тому в папці із змінним файлом вона зберігає його резервну копію з розширенням .Backup.
CFF Explorer
Для тих, хто точно знає, що робить.
CFF Explorer - безкоштовна і досить потужна програма для роботи з PE заголовками від автора 4 GB Patch. завантажити можна з сайту учасника .
- Встановивши і запустивши програму, відкриваємо потрібний .EXE файл.
- Переходимо до пункту File Header.
- Клацаємо в правому нижньому кутку з'явилася таблиці (так і написано - Click here).
- У вікні виставляємо галочку навпроти App can handle> 2gb address space.
- Застосовуємо і зберігаємо файл.
Як видно, програма дозволяє редагувати і інші параметри, має велику кількість інструментів і навіть вбудований дизассемблер.
Зворотна дія - те ж саме, з тією різницею, що галочку ми прибираємо.
EDITBIN.EXE
Невелика утиліта EDITBIN.EXE, яка є в комплекті Microsoft Visual Studio.
Дії такі (запускається з командного рядка):
Виставити: EDITBIN.EXE / LARGEADDRESSAWARE name.exe
Прибрати: EDITBIN.EXE / LARGEADDRESSAWARE: NO name.exe
За допомогою цього ж параметра (/ LARGEADDRESSAWARE) задається використання пам'яті для проектів Visual Studio.
висновок
Підсумовуючи вищесказане - для того, щоб 32-розрядний додаток могло використовувати більше 2 GB пам'яті повинні бути дотримані дві умови:
- Додаток має бути встановлено на Windows x64 (краще) або Windows x86 з включеним 4GT .
- Додаток має мати прапор IMAGE_FILE_LARGE_ADDRESS_AWARE