Основы ядерной инженерии
Традиционно Windows считается закрытой системой, залезть внутрь которой на предмет «чего-то там подкрутить» и трудно, и небезопасно. То ли дело Linux, позволяющая перестраивать себя как угодно, вплоть до замены ядра. Но на самом деле менять ядра можно и в Окнах, нужно только знать как. Эта статья затрагивает следующие системы: Windows NT, 2000, XP, 2003. Пользователи Windows 9x/Me могут ее даже не читать .
Введение
Все началось с того, что на веб-сайте www.jelezka.ru появилось сообщение о новом способе разгона Windows XP, суть которого в общих чертах сводилась к замене стандартного ядра, которым, как правило, является ACPI-ядро, на «Standard PC with C-Step i486», после чего производительность системы якобы существенно возрастала. Автор заметки напирал на то, что, дескать, Microsoft умышленно замедляет быстродействие процессора в новых ядрах, и потому старое ядро намного предпочтительнее. Эта информация не осталась незамеченной и вызвала бурную дискуссию, быстро переросшую в жаркий флейм. В основном спорящие стороны с умным видом обсуждали темы, в которых мало что понимали, и оперировали тезисами в стиле «Если бы это было правдой, M$ уже давно засудили» и «Где такую траву брал?!». Реальную замену ядра осуществили единицы. У одних система воспряла духом и завращалась быстрее прежнего, другие же не обнаружили никаких изменений в производительности.
Самое забавное, что на самом деле никакого открытия сделано не было. Многие продвинутые товарищи экспериментировали с ядрами еще во времена Windows NT 4.0. Лично я могу подтвердить: да, замена ядра может дать ощутимый прирост производительности, но тогда о ACPI и многих других современных вкусностях придется забыть. Кстати говоря, это документированная особенность поведения системы, и никакого подвоха здесь нет. Не веришь мне – спроси у Microsoft.
Ядерная хирургия
Существует несколько способов смены ядра, самым известный из которых сводится к переустановке операционной системы и нажатию клавиши F5 во время тестирования конфигурации («Press F6 if you need to install a third party SCSI or RAID driver»/»Нажмите F6, если Вам необходимо загрузить SCSI или RAID драйвер стороннего производителя»). Нет, все верно! Когда тебя просят нажать F6, ты должен нажать F5. Вот такая она, Microsoft.
Если никаких клавиш не трогать, Windows автоматически выбирает наиболее подходящее, с ее точки зрения, ядро (если, конечно, не ошибется). F7 отменяет тестирование и назначает стандартное ядро по умолчанию, а F5 форсирует выбор ядра вручную. В штатный комплект поставки Windows XP входят около десятка различных ядер, перечисленных в таблице 1.
Тип ядра должен соответствовать типу оборудования. Так, например, работа стандартного ядра на многопроцессорной материнской плате (даже если на ней установлен всего лишь один процессор) не тестировалась Microsoft и потому не гарантируется. Однако в подавляющем большинстве случаев это ядро работать все-таки будет.
Преемственные версии ядер можно переключать и без установки системы, просто заменяя файлы библиотеки аппаратных абстракций – Hardware Abstraction Layer или сокращенно HAL (по умолчанию hal.dll) и исполнительной системы – Executive System, также называемую KERNEL'ом (по умолчанию ntoskrnl.exe, не путать с kernel32.dll – этот файл совсем из другой оперы). Вместе они и образуют ядро операционной системы, на котором держатся все остальные компоненты.
Войди в Панель управления -< Система -< Оборудование -< Диспетчер устройств -< Компьютер (Control Panel -< System -< Hardware -< Device Manager -< Computer)и дважды щелкни по нему мышкой, раскрывая иерархическую ветвь, из которой выпрыгнет Компьютер с ACPI/Advanced Configuration and Power Interface (ACPI) PC или что-то в этом роде. Левой клавишей вызови «Cвойства» (Properties) и в закладке «Драйвера» (Drivers) нажми «Обновить драйвер» (Update Driver). Если этой закладки нет, значит, ты не обладаешь правами администратора.
Диспетчер устройств предложит тебе на выбор одно или несколько преемственных ядер, которые вступят в строй сразу же после перезагрузки. Правда, если обновление пройдет неудачно, система наотрез откажется загружаться. Обычно это происходит при попытке обновления стандартного ядра до ACPI или наоборот. Дело в том, что ACPI и не-ACPI ядра используют различные деревья устройств и по-разному распределяют системные ресурсы. Диспетчер устройств позволяет переключать только преемственные версии ядер, но иногда он ошибается, и систему приходится чинить. Удерживая F8 при запуске Windows, дождись появления загрузочного меню. Войди в Last Known Good Configuration и, выбрав подходящий профиль оборудования, скажи Configuration Recovery.
Альтернативный подход
Для обхода ограничений, свойственных диспетчеру устройств, предусмотрен чисто хакерский способ ручного переключения ядер, позволяющий выбирать непреемственные ядра (или ядра, выдернутые из других дистрибутивов Windows), а также организовывать многовариантную загрузку. Для этого необходимо отредактировать файл boot.ini, находящийся в корневом каталоге загрузочного диска. Открой его в Блокноте и найди следующую строку:
Код: Выделить всё
multi(0)disk(0)rdisk(0)partition(1)WINNT="Windows XP Professional" /fastdetect /SOS
Если ты не устанавливал никаких сервис-паков, открой каталог WINNTSystem32Driver Cachei386driver.cab и вытащи из него файлы, название которых начинается с «HAL». Затем найди файлы, содержащие «nt» и «kr». Скопируй их в каталог WINNTSystem32. На машинах с установленным сервис-паком указанные файлы ищи где-нибудь в каталоге сервис-пака. Скажем, в WINNTServicePackFilesi386
Руководствуясь таблицами 2, 3 и 4, выбери ядро свой мечты, вписав соответствующие HAL'ы и KENREL'ы в boot.ini, отредактированный вариант которого может выглядеть, например, так:
Код: Выделить всё
multi(0)disk(0)rdisk(0)partition(1)WINNT="Windows XP Professional" /fastdetect /SOS
multi(0)disk(0)rdisk(0)partition(1)WINNT="Windows XP hacked" /fastdetect /SOS /HAL=HALMPS.DLL /KERNEL=NTKRNLMP.EXE
Так много ядрышек хороших…
Какую версию ядра выбрать? Это зависит от архитектурных особенностей компьютера и твоих потребностей. Таблица 2 описывает назначения некоторых наиболее популярных ядер, из которых в первую очередь хотелось бы обратить внимание на связку NTKRNLMP.EXE/HALMPS.DLL, ориентированную на многопроцессорные системы. Если ты поставил Windows на компьютер без поддержки Hyper-Threading, а затем неожиданно решил заиметь эту поддержку, купив новехонький Pentium-4, система не захочет работать со вторым процессором до тех пор, пока ты не переустановишь ее или… не заменишь ядро. Второе, естественно, проще и быстрее. Кстати, о быстроте.
Ходят слухи, что ядра с поддержкой ACPI проигрывают не-ACPI ядрам по скорости. И хотя доля правды здесь есть, в общем случае это не так. Нормально работающий ACPI не тормозит систему, если, конечно, ничего не конфликтует и не глючит. Проблема в том, что конфликты возникают удручающе часто, поскольку ACPI задиристый, как петух, и монструозный, как мамонт. Другая проблема связана с охлаждением процессора путем его автоматического отключения во время простоя системы. Некорректная поддержка ACPI зачастую приводит не только к 100% загрузке ЦП, но и к характерному треску во время проигрывания аудиофайлов. К тому же, многие ACPI-системы поддерживают динамическое управление производительностью, подбирая тактовые частоты и тайминги в соответствии с текущими потребностями, в том случае если ACPI-контроллеру удастся их угадать. Еще ACPI пытается оптимизировать системные ресурсы, старательно вешая на одно прерывание сразу несколько устройств. Вообще-то эта ситуация вполне нормальна (см. техническую заметку Q252420 в «Базе знаний» Microsoft), но не идеальная с точки зрения производительности.
Сравнивая производительность ACPI и не-ACPI ядер, не стоит забывать, что они используют разные таймеры для измерения системного времени, которые, между прочим, никто не калибровал, поэтому бенчмарки разных ядер могут существенно различаться уже за счет одной лишь инструментальной погрешности!
Многопроцессорные ядра самые медленные. Использовать их на однопроцессорных машинах не рекомендуется. Ядро, доставшееся в наследство от 486 машин, самое быстрое, однако, и самое ограниченное в своих функциональных возможностях. При использовании современного оборудования и некоторых навороченных игрушек могут появиться (а могут и не появиться ) серьезные проблемы. Некоторые «специалисты» авторитетно утверждают, что выбирая i486, можно забыть про SIMD и SSE2, а это не ускоряет, а наоборот, замедляет систему. В действительности же никакого отношения к SIMD/SSE2-командам ядро не имеет, ведь не оно же их исполняет. Другой вопрос, что при переключениях с одной задачи на другую все SIMD/SSE2 регистры должны быть сохранены, иначе совместная работа двух и более мультимедийных приложений станет невозможной. Дизассемблирование подтверждает, что i486 ядро использует команду FXSAVE, автоматически сохраняющую все SIMD/SSE2-регистры, поэтому как раз на этот счет волноваться не надо.
Разгон и его последствия
Смена ядра не заставит процессор вычислять синус угла быстрее и уж точно не расширит пропускную способность интерфейсных шин. Популярные тестовые программы для измерения быстродействия ядер также не годятся, поскольку не обнаруживают никакого прироста производительности даже тогда, когда разница видна невооруженным глазом. Почему так происходит? Все очень просто. «Быстрые» ядра отличаются от «медленных» прежде всего накладными расходами на обработку прерываний и переключений между задачами. Промежуток времени между двумя переключениями (условно называемый квантом) - это целая вечность для процессора, в течение которой он успевает обсчитать множество тестовых задач, в результате чего длительность переключений просто не учитывается. К тому же, при малом числе потоков издержки от переключений между ними достаточно невелики, но стоит запустить параллельно с тестовой программой несколько тяжеловесных приложений, как все изменится!
Практика показывает, что на компьютерах, оснащенных SDR-памятью и процессорами с частотой менее 1 ГГц, i486 ядро существенно повышает отзывчивость системы, и работать с ней становится значительно приятнее. Для проверки запусти пару десятков приложений (обычное состояние системы к концу рабочего дня, не правда ли?) и замерь время выполнения контрольной задачи (например, наложения фильтра на гигабайтный рисунок в Photoshop, компиляцию мегабайтного файла, контекстный поиск в тысячестраничном pdf'e).
Естественно, с ростом быстродействия компьютера замена ядра дает все меньший и меньший выигрыш быстродействия, но даже на мощных рабочих станциях он остается заметным. Попутно исчезают конфликты, присущие не вполне ACPI-совместимым устройствам, драйверам и BIOS'ам. На смену им приходят конфликты с древней версией ядра, на совместимость с которой ни устройства, ни драйвера, ни BIOS'ы вообще никем не тестировались. Поэтому как поведет себя 486-ядро в твоей системе, заранее не известно.
Заключение
Единого мнения по поводу целесообразности перехода на 486 ядро как не было, так и нет. Сообщения о реально проведенных экспериментах единичны, и статистики по ним не построишь. Тем не менее, перепробовать различные ядра, сравнивая их на вкус, все-таки стоит. Это не только интересно, но еще и познавательно.
Крис Касперски
http://www.xakep.ru/magazine/xa/068/024/5.asp