Windows x86 и использование памяти более 4GB, да, возможно!

Продолжение. Начало смотрите тут

Куда исчезает память в клиентских версиях Windows x86

В прошлой статье было показанои, что все пользовательские версии x86, начиная с Windows XP SP2, не могут использовать физическую память больше 4-гигабайт из-за установленного в ядре ограничения. Мы нашли объяснение Microsoft, что это ограничение было сделано для того, чтобы избежать неустойчивой работы драйверов устройств, написанных без поддержки режима PAE (Physical Address Extension).
Остановились мы на том, что ограничение 4 гигабайта оперативной памяти не только делает невозможным использование физической памяти большего объема, но и, как мы скоро увидим, приводит к проблемам и в этом диапазоне.
Перейдем от теории к практике и на реальном примере покажем, почему в самом начале мы определили границу «большой памяти» для 32-разрядных операционных систем на уровне около 3, а не 4 ГБ.

Посмотрим, сколько памяти видит windows 7, и что говорит об использовании физической памяти в этом компьютере сама операционная система

Такая вот картина. Если верить тому, что мы видим, а не верить, вроде, оснований пока нет, то получается, что 1,51 ГБ – “деньги на ветер”.
Как же так? А все очень просто.

Посмотрим еще несколько отчетов. Запустим “Диспетчер задач”, затем “Монитор ресурсов” и откроем вкладку “Память”

Ну вот, собственно, и готовый ответ на вопрос об использовании физической памяти — сколько памяти видит windows 7, или куда исчезли полтора гигабайта физической памяти. Они зарезервированы под нужды оборудования. Нет, не так. Под нужды оборудования зарезервирована не память, а 1,5 ГБ адресного пространства в интервале 4 ГБ. Так как одно и тоже адресное пространство не может быть одновременно использовано и устройствами и памятью компьютера из-за неизбежного конфликта, “лишней” физической памяти стало просто некуда деться и она оказалась недоступна. Именно зарезервировано и именно виртуального адресного пространства из 4ГБ. На первый взгляд такое положение вещей не кажется правильным и, естественно, не вызывает радости. Однако, как показала история развития компьютерной техники, решение разместить порты ввода-вывода устройств в основном адресном пространстве процессора было исключительно верным. Это позволило многократно увеличить скорость обмена данными с устройствами и разгрузить центральный процессор. Как мы помним, первым процессором, который имел возможность адресовать 4 гигабайта оперативной памяти, был Intel 80386 выпущенный в 1985 году. Когда разрабатывался компьютер на его основе, было принято решение выделить адреса портов ввода-вывода устройств в верхней части 4-гигабайтного виртуального адресного пространства доступного процессору, а нижнюю часть отдать под физическую память.
Представить себе в то время клиентский компьютер с 4 гигабайтами оперативной памяти было практически невозможно. И действительно, долгие годы адреса устройств и максимальный адрес установленной физической памяти шли на встречу друг другу, но не пересекались, и никаких конфликтов не возникало. Выглядело это примерно так.

Некоторое время назад реально появились клиентские компьютеры с 3 — 4 гигабайтами оперативной памяти (а сейчас то этим уже никого не удивишь) и адреса оперативной памяти и устройств “встретились” и пересеклись. Вот так условно можно представить картину рспределения адресного пространства и использования физической памяти для компьютера с установленными 4 гигабайтами оперативной памяти

Красная зона в адресном пространстве, занятом устройствами, отражает конфликт, который всегда решается не в пользу физической памяти – это реальные потери, те самые 1,5 ГБ на рисунке выше.
Величина “потерь” зависит от того, как много физической памяти установлено в компьютере, и какое адресное пространство резервируют под себя устройства. На разных компьютерах она будет различной. Например, на одном из находящихся под рукой компьютеров под нужды оборудования резервируется в два раза меньше — около 0,75 ГБ, но так как физической памяти установлено 6 ГБ, то потери в 32-битной Windows составят уже примерно 2,7ГБ, то есть почти половину.
Воспользуемся маленькой диагностической утилитой MemInfo от Alexa Ionescu. Запустим ее с правами администратора на нашем ноутбуке с ключом –r и посмотрим как используется физическая память

А теперь откроем “Диспетчер устройств” в “Управление компьютером”. Переключим “Вид” на “Ресурсы по типу” и откроем блок “Память”

Сравниваем верхнюю границу физической памяти “9F800000”, определенную утилитой MemInfo, с нижней границей диапазона адресов, зарезервированных устройствами. В нашем случае это “A0000000” для видеокарты AMD Radeon HD. Все сходится. Есть еще окно в нижней части в диапазоне 640 КБ – 1 МБ. Как не трудно догадаться, это атавизм, пришедший к нам от 16-разрядного процессора 8086 и ДОС.
Вот так обстоят дела в “классических” 32-разрядных системах. В нашем случае система не является “классической” из-за включенного режима PAE, но выглядит абсолютно так же благодаря Microsoft-овскому ограничению. Очевидно, что задействовать в таких системах полностью 4 ГБ оперативной памяти невозможно в принципе.
Microsoft, некоторым образом, вводит пользователей в заблуждение, декларируя поддержку 4 гигабайт оперативной памяти. На самом деле, как мы уже поняли, система не может задействовать всю память из-за того, что адресное пространство ограничено сверху “FFFFFFFF” (4 ГБ), а именно это и делает Microsoft не смотря на то, что процессор может адресовать несоизмеримо больше и сама ОС давно поддерживает PAE. Одну из наиболее вероятных причин по которой это было сделано мы затронули в первой части.

По-хорошему, для того, чтобы продемонстрировать, как можно вернуть “потерянную” память, нужно установить на нашем ноутбуке Linux с ядром PAE или серверную 32-разрядную версию Windows, причем такую, для которой заявлена поддержка более 4 ГБ памяти. Это, например, Windows Server 2003 или 2008 в редакции Enterprise. Если же снять ограничения на 4ГБ, а об єтом ниже, то получится что-то вроде этого.

Как видим, “потерянная” память сразу нашлась. Еще раз открываем монитор ресурсов

Тут Windows пытается ввести нас в заблуждение когда говорит, что теперь под оборудование зарезервировано всего 138 Мбайт. На сомом деле ровным счетом ничего не изменилось, что можно увидеть из распределения адресов в "Диспетчере устройств" – все устройства остались на своих местах в диапазоне адресов между “A0000000” и “FFFFFFFF”. То есть, на самом деле серым цветом монитор ресурсов показывает не размер адресного пространства, зарезервированного под нужды устройств, а суммарный объем “потерянной” памяти. Почему “суммарный” станет ясно, когда мы перейдем к компьютеру с объемом установленной физической памяти больше 4 ГБ.
Диапазоны зарегистрированной физической памяти с помощью утилиты MemInfo

Видно, что внизу добавился новый диапазон размером 1,4 ГБ. Это и есть наша “потерянная” память. Из-за того, что мы продолжаем оперировать 32-х разрядными адресами, получился, как бы, конфликт. На самом деле никакого конфликта нет в силу того, что добавившийся диапазон физических адресов лежит выше “FFFFFFFF”. Если графически изобразить то, что получилось после того, как было снято 4-гигабайтное ограничение

“Умный” чипсет и BIOS компьютера перенесли конфликтную часть физической памяти выше 4 Гбайтной границы. Благодаря этому и работающему режиму PAE, этот участок физической памяти стал доступен операционной системе.
Тут не лишним будет отметить, что для того, чтобы “потерянная” память могла вернуться, нужен не только процессор с поддержкой PAE, но и материнская плата, которая, во-первых, поддерживает больше 4 ГБ ОЗУ, во-вторых, умеет перемещать адресные блоки физической памяти, конфликтующие с оборудованием, выше “FFFFFFFF”. В BIOS по поводу последнего даже может быть отдельная настройка, что-то типа “Memory Remapping”, либо это происходит автоматически.

Как убрать ограничение на 4ГБ
Внимание! Это действие может выполняться только в исследовательских целях на свой страх и риск. Делайте резервную копию своих данных.

Ограничение максимально доступной физической памяти установлено в PAE ядре, которое в Windows 7 / Vista называется NTKRNLPA.EXE. Внутренняя процедура MxMemoryLicense вызывает недокументированную функцию ZwQueryLicenseValue. Такая проверка выполняется два раза. Патч, предложенный исследователем Джефф Шапель (Geoff Chappell), подразумевает очень небольшие изменения в ядре – всего по 7 байт в каждом из двух вхождений. После сделанных изменений ядро продолжает вызывать ZwQueryLicenseValue, но результаты этой проверки подменяются так, что разрешенный верхний предел физической памяти устанавливается в 128 ГБ.
Предполагается, что в дальнейшем модифицированное ядро будет называться NTKR128G.EXE.
Полученное новое ядро может теперь работать со всей установленной памятью, но есть некоторые препятствия для его использования. Первое - это контрольная сумма.
Для всех исполняемых файлов, загружаемых WINLOAD, в число которых, естественно, входит ядро, контрольная сумма, записанная в заголовке исполняемого файла, должна быть правильной. В результате модификации ядра контрольная сумма изменилась и стала недействительной. Ее нужно привести в соответствие. Это можно сделать с помощью, например, EDITBIN из Microsoft Visual Studio.
editbin /release ntkr128g.exe

Второе - цифровая подпись.
Ядро является одним из исполняемых файлов, который должен быть подписан сертификатом, полученным от одного из немногочисленных корневых центов. Публичные ключи корневых центров жестко прописаны в загрузчике. Исправленное ядро будет иметь недействительные цифровые подписи. Но и это препятствие можно преодолеть.
Одним из таких способов является использование тестового режима, который Microsoft предоставляет для тестирования драйверов в процессе их разработки. В тестовом режиме загрузчик позволяет выполнять файлы, подписанные любым корневым сертификатом. Можно создать свой собственный тестовый сертификат и подписать им измененную копию ядра. После этого оно будет загружаться при старте Windows в тестовом режиме (TESTSIGNING). Несущественной неприятностью этого варианта будет появление предупреждающей надписи в правом нижнем углу рабочего стола.
Подходящими инструментами для реализации такого способа могут служить Windows Software Development Kit (SDK) или Windows Driver Kit (WDK). С их помощью можно сделать свой собственный сертификат:
makecert -r -ss my -n "CN=My Own Testing Authority"
Это команда создаст корневой сертификат с именем “My Own Testing Authority» и установит его в личное хранилище сертификатов. Подписать модифицированное ядро ​этим сертификатом можно выполнив команду:
signtool sign -s my -n "My Own Testing Authority" ntkr128g.exe

Теперь имеется модифицированное ядро для тестирования возможности использования в 32-разрядной Windows физической памяти выше 4 ГБ. Его нужно скопировать в каталог C:\Windows\System32 и создать новый вариант загрузки с помощью bcdedit.exe.
Новую загрузочную запись создаем путем копирования текущей (current) и даем ей новое имя, например, «Windows Using All My Memory»:
bcdedit /copy {current} /d "Windows Using All My Memory"
Если запустить bcdedit без параметров то можно узнать {идентификатор} новой записи.

Дальше необходимо добавить директивы:

bcdedit /set {идентификатор} kernel ntkr128g.exe
– указываем, какое ядро нужно загрузить;
bcdedit /set {идентификатор} testsigning Yes
– говорим, что работаем в тестовом режиме;
bcdedit /set {идентификатор} pae ForceEnable
– на всякий случай.

Если после патчевания и перезагрузки с новым ядром посмотреть сведения о памяти то можно увидеть

Судя по тому, что говорит о себе система, она теперь работает со всеми 6 ГБ физической памяти

“Монитор ресурсов” сообщает, что под оборудование практически ничего не зарезервировано. Но самом деле зарезервированы все те же 0,76 ГБ адресного пространства, но оно теперь не вычитается из 4ГБ объема памяти.
Смотрим диапазоны зарегистрированной в системе памяти

Как и ожидалось, добавился новый большой диапазон памяти выше 4 ГБ.

Применительно к Windows 7 x86 делать все описанное выше “ручками”, скорее всего, не понадобится. В свободном доступе есть программы, которые автоматизируют весь этот процесс. Найти их в сети очень легко.
Один из комплектов назывался ReadyFor4GB. Он примечателен тем, что состоит из трех отдельных модулей, первые два из которых повторяют описанные выше этапы. Третий модуль представляет собой утилиту для удаления Watermark (предупреждающая надпись на рабочем столе после загрузки с новым ядром).
Учитывая, что в комплекте есть руководство на русском языке, в котором четко прописана последовательность запуска программ и ответы на их вопросы, подробное описание процесса будет здесь излишним. Достаточно делать все строго по порядку. Все программы нужно запускать с правами администратора. Проще всего в проводнике Windows — «подсвечиваем» мышью файл программы, которую нужно запустить, нажимаем правую кнопку мыши и в появившемся контекстном меню выбираем «Запуск от имени администратора». Или запустить от имени администратора cmd
В силу того, что “родное” ядро остается в неизменном виде, систему в любой момент можно вернуть в исходное состояние. Благодаря этому, описанный патч можно считать относительно безопасным.

Совершенно не лишним будет до начала запуска патчеров сделать экспорт содержимого системного хранилища в файл. Файл можно сохранить в любом месте и дать ему произвольное имя (главное вспомнить потом название файла и где он лежит). Эту копию впоследствии можно использовать для быстрого и простого восстановления первоначального состояния системного хранилища, что равносильно отмене всех сделанных изменений.
Достаточно запустить командную строку с правами администратора:
bcdedit /export "C:\Backup\bcd-backup"
где C:\Backup\ – произвольно выбранная для хранения папка, а bcd-backup – произвольное имя файла копии хранилища.
Когда захочется прекратить все эксперименты с памятью, достаточно будет набрать:
bcdedit /import "C:\Backup\bcd-backup"

Еще один вариант патчера называется 4GB-7600_RTM_x86. В нем вообще один единственный исполняемый файл, то есть «все в одном флаконе». Не так давно появился патч, который позиционируется как универсальный для всех версий Windows, включая и Windows 8.

Как видно, ограничение на 4ГБ в 32-х разрядных ОС - это "творение" исключительно Microsoft, которое, к счастью, можно обойти.

Источник: ithabits.ru