воскресенье, 2 июля 2017 г.

Как я преодолевал предел 4Гб на Windows XP 32бит


Сразу оговорюсь, «преодолевал» в названии отражает только тот факт, что теперь моя XP видит всю память, установленную на системной плате. Не я придумал способ, я просто им воспользовался и теперь хочу поделиться.
Вопрос о четырёх гигабайтах памяти в Windows XP (здесь, и далее 32 бит) поднимался на просторах Интернет неоднократно. И так же неоднократно делался вывод, что более четырёх увидеть в принципе невозможно, а так как оборудование тоже требует адресного пространства, то и того меньше. Обычно 3.25 Гб, или около того. Очень подробно и убедительно история вопроса освещена здесь: Четыре гигабайта памяти — недостижимая цель?

Меня этот вопрос тоже волновал. Хотя, казалось бы, можно поставить 64 битную систему, или даже Windows Server (как известно он даже в 32-битной версии видит всю память), но я хотел пользоваться Windows XP. Два раза за последние 3 года я переходил на Windows 7, в первый раз на 64-битную, второй раз на 32-х битную, но в итоге оба раза вернулся назад на XP, которая живёт у меня без переустановки с 2007 года.
Последний раз я отказался от семёрки в пользу старушки буквально две недели назад. Притом, надо отметить, что семёрка была хоть и 32-х битная, но в ней была разблокирована возможность видеть всю доступную память. Способ разблокировки доступен в Интернет. И теперь мне с новой силой захотелось решить этот вопрос и в XP.

Поиски привели на этот сайт: Patch Vista’s Kernel to Address more than 4 GB of Memory
Статья посвящена разблокировке Windows Vista, зато в комментариях, пара человек описывает аналогичный способ для Windows XP. Я решил последовать их советам и опробовать эту методику на практике.

Для начала нужен дистрибутив Windows XP SP1. Возможно, подойдёт и просто первый сервиспак, не знаю, у меня его нет. В общем-то, там нужен только один файл. А именно файл библиотеки Hardware Abstraction Layer. Начиная со второго сервиспака эта библиотека работает с PAE «фиктивно», т.е. даже если режим расширенной трансляции адресов включён – он ничего не делает и не выходит за пределы четырёх гигабайт. А вот библиотека от первого сервиспака работает полноценно и может адресоваться ко всей доступной памяти, аналогично тому, как работает с памятью 32-битный Windows Server. В установленной Windows XP данный файл называется hal.dll, но в дистрибутиве имеется несколько HAL-файлов, и только один из них инсталлируется в систему под именем hal.dll в процессе установки. Необходимо было узнать, какой из файлов нужно использовать на моём конкретном оборудовании. Делается это просто, надо вызвать Свойства в контекстном меню проводника на файле hal.dll в установленной Windows. Файл находится в папке %systemroot%\system32, и вот что я увидел:



В дистрибутиве Windows XP SP1 в папке I386, я взял файл HALMACPI.DL_. Это архив, в котором находится один файл, искомый мной halmacpi.dll. Я его извлёк WinRAR’ом, но можно обойтись и командной строкой:
expand HALMACPI.DL_ HALMACPI.DLL
Полученный файл надо поместить в папку %systemroot%\system32, что я и сделал. Хочу ещё раз обратить внимание, что если кто-то захочет повторить мои шаги, файл надо брать с именем, указанном в свойстве «Исходное имя файла» в свойствах hal.dll из установленной Windows XP.

Второе, что необходимо сделать, это получить пропатченную версию ядра Windows. Как известно, существует 4-ре версии ядра:
  • ntoskrnl.exe — однопроцессорное ядро Windows.
  • ntkrnlmp.exe— многопроцессорное ядро Windows.
  • ntkrnlpa.exe — однопроцессорное ядро Windows с более чем 3 ГБ оперативной памяти.
  • ntkrpamp.exe — многопроцессорное ядро Windows с более чем 3 ГБ оперативной памяти.

В той инструкции, которую я использовал, говорилось про ядро ntkrnlpa.exe и в моей инсталляции Windows стоит именно оно. Что делать, если попадётся другое ядро – я, честно говоря, не знаю.
Первым делом, я сделал копию ядра, назвал его krnl16.exe, в принципе название неважно. Далее HEX-редактором (я использовал DOS-Navigator, по старой памяти) надо найти последовательность
  • BB 00 00 10 00 33 FF 6A 07 8B F0 и заменить её на
  • BB 00 00 40 00 33 FF 6A 07 8B F0

Здесь 1000h = 4096 Мб, заменяем на 4000h = 16384 Мб. Т.е. поднимаем ограничение до 16Гб. В принципе, можно вписать и большее число. Пропатченный файл также должен располагаться в system32.

Теперь осталось отредактировать boot.ini. Нужно скопировать имеющуюся строчку и дописать пару параметров. У меня была строка:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS.XP=«Microsoft Windows XP Professional RU» /FASTDETECT /USEPMTIMER /NOSERIALMICE /NOEXECUTE=OPTIN

Я добавил в неё /KERNEL=KRNL16.EXE /HAL=HALMACPI.DLL /PAE и в результате получилось:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS.XP=«Microsoft Windows XP Professional RU 16Gb» /FASTDETECT /USEPMTIMER /NOSERIALMICE /NOEXECUTE=OPTIN /KERNEL=KRNL16.EXE /HAL=HALMACPI.DLL /PAE
Теперь есть возможность загружаться как в стандартный Windows с присущим ему ограничением на память, так и в пропатченный, так как я не заменял ни одного системного файла, а только добавил два, которые включаются в работу с помощью вышеописанных параметров boot.ini

Ребут!
И… BSOD.
В принципе, такое может быть. Как следует из обзора истории проблемы на ixbt причиной, по которой Microsoft отключила адресацию верхней памяти, было существование кривых драйверов под различное оборудование, кривизна которых, впрочем, проявлялась только в полноценном режиме PAE. Вполне вероятно, у меня сбоит один из них, за 6 лет в системе накопилось много всего, но какой? Пробую запуститься в безопасном режиме, и УРА! Вот они, мои гигабайты:



Но как определить сбойный модуль? Погуглив, я нашёл для этого методику, которая заключается в анализе малого дампа памяти, создаваемого Windows при BSOD. Анализ производится программой Blue Screen View, но вот все найденные мной способы включения режима записи дампа к успеху не привели: дамп не создавался, поэтому пришлось использовать научный метод тыка. Для начала я деинсталлировал то ненужное, что нашлось в системе. А именно драйвер защиты Guardant и драйвера ATI от старой видеокарты.
Ребут.
Результат превзошёл мои ожидания. Честно говоря, я не ожидал, что метод тыка даст такие результаты, и попробовал его просто, чтобы сделать хоть что-нибудь. Который из драйверов вызывал проблему, я точно не знаю, но думаю, что, скорее всего Guardant.
Но главное: цель достигнута, и теперь я подумываю о расширении памяти до 8-ми Гб.

  • Примечание 1. Поскольку в методике используется dll из первого сервиспака, есть вероятность, что в ней имеются какие-либо уязвимости, закрытые последующими сервиспаками. Я не изучал этот вопрос.
  • Примечание 2. Некоторые драйверы в пропатченой Windows XP могут вызывать BSOD. Впрочем, их крайне мало в природе.
  • Примечание 3. В первоисточнике ценных знаний сообщают, что на некоторых системах имеются проблемы с USB при использовании данной методики. У меня пока проблем нет. По крайней мере, клавиатуры, мышки и флешки работают в штатном режиме.

0 коммент.:

Отправить комментарий