Введение Все началось с того, что на веб-сайте 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 Теперь либо добавь к ней два новых ключа /KERNEL= и /HAL= , указав имена файлов исполнительной системы ядра и уровня аппаратных абстракций, либо выдели всю строку целиком и вставь ее в конец файла boot.ini, изменив текст "Windows XP Professional" на что-нибудь в стиле "Windows XP hacked" и добавив указанные ключи. Тогда при старте системы на экране появится меню многовариантной загрузки, позволяющее быстро переключаться между различными версиями ядра, не рискуя при этом обрушить основную конфигурацию системы (если это меню не появится, жми на F8). Если ты не устанавливал никаких сервис-паков, открой каталог WINNT\System32\Driver Cache\i386\driver.cab и вытащи из него файлы, название которых начинается с «HAL». Затем найди файлы, содержащие «nt» и «kr». Скопируй их в каталог WINNT\System32. На машинах с установленным сервис-паком указанные файлы ищи где-нибудь в каталоге сервис-пака. Скажем, в WINNT\ServicePackFiles\i386. Руководствуясь таблицами 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 Сохранив изменения в boot.ini, перезагрузись. Имей в виду, что если ты отредактируешь этот файл неправильно, система может подавиться при его загрузке, наотрез отказываясь запускаться! И если ты не хочешь заново переустанавливать систему, то не забудь перед началом эксперимента скинуть резервную копию оригинального boot.ini на загрузочную дискету. Так много ядрышек хороших… Какую версию ядра выбрать? Это зависит от архитектурных особенностей компьютера и твоих потребностей. Таблица 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 ядро как не было, так и нет. Сообщения о реально проведенных экспериментах единичны, и статистики по ним не построишь. Тем не менее, перепробовать различные ядра, сравнивая их на вкус, все-таки стоит. Это не только интересно, но еще и познавательно. Внутри ядра Существуют ли теоретические обоснования того, почему i486 ядро увеличивает быстродействие компьютера? Да, существуют. И хотя до сих пор не ясен конкретный вклад каждого из них, общая картина событий выглядит скорее тривиальной, чем удивительной. Начнем с того, что поддержка многопроцессорности не проходит бесследно и налагает на архитектуру ядра определенный отпечаток, заставляя его решать те задачи, которые на однопроцессорных машинах просто не возникают. Взять хотя бы проблему когерентности, т.е. согласованности данных. Представь себе, что произойдет, если один процессор обратится к недостроенной структуре данных, конструируемой другим процессором. Чтобы этого избежать, в каждый момент времени только один процессор может модифицировать данные, а остальные блокируются при помощи спинлуков (от английского spin lock – взаимоблокировка). В однопроцессорных системам спинлуки лишены смысла и должны заменяться на NOP'ы, однако, в Windows этого не происходит, и большую часть отведенного ему процессорного времени ядро расходует именно на спинлуки. Хуже того! Алгоритмы, эффективно исполняющиеся на двух или даже четырех процессорах, далеко не всегда сохраняют свою эффективность на одном. Судя по всему, во времена 486 процессоров Microsoft поддерживала независимые линейки ядер, оптимизируя каждое из них по отдельности. Когда же аппаратные возможности персональных компьютеров возросли, она с облегчением свела все ядра воедино. Дизассемблирование доказывает, что однопроцессорная версия ядра практически во всем повторяет многопроцессорную и работает намного медленнее, чем могла бы. Другой источник тормознутости – это пресловутый Plug and Play. Древние ядра самостоятельно обслуживали шины, DMA и прочие системные устройства, за каждым из которых жестко закреплялось свое пространство адресов ввода-вывода, свой IRQ и свой канал DMA. Теперь же все значительно усложнилось и… затормозилось. Ядро абстрагировалось от конкретного оборудования и перешло на виртуальные шины, эмулируемые драйверами соответствующих устройств. Изменилось все, включая схему обработки прерываний. Это раньше диспетчер знал все прерывания в лицо, а теперь он вынужден постоянно обращаться к базе данных, выясняя, какой вектор какому устройству принадлежит (ведь системные ресурсы могут динамически переназначаться во время работы). Как уже говорилось, ядро состоит из библиотеки аппаратных абстракций и исполнительной системы. Архитектурно библиотека аппаратных абстракций включает в себя набор системно зависимых функций, на которые опирается системно независимое ядро, реализующее базовые сервисы операционной системы. При переносе оси на другую платформу в принципе достаточно переписать один лишь HAL, не трогая все остальное. Это в теории. На практике же, во-первых, всякий перенос требует радикальной переделки всей системы, а во-вторых, на сегодняшний день Windows 2000, XP и 2003 существуют всего лишь на одной платформе – платформе IBM PC, и потому по ряду соображений HAL и исполнительная система тесно переплетены. Конкретный перечь функций ядра приводить нет смысла, т.к. он постоянно меняется от версии к версии и системные компоненты мигрируют из одной библиотеки в другую (раньше графический интерфейс был прикладной подсистемой, теперь это часть ядра, раньше шинами и ресурсами заведовал HAL, теперь эта функция возложена на исполнительную подсистему и ACPI, ну и т.д.). Что такое ACPI Вопреки своей аббревиатуре, расшифровываемой как Advanced Configuration and Power Interface, ACPI означает нечто большее, нежели простой менеджер питания. Это еще и менеджер ресурсов, фактически являющийся корневым перечислителем. В ACPI-системах все устройства (как-то: PCI/ISA шины, жесткие диски, видеокарты) подключены к виртуальной шине ACPI-контроллера, в чем легко убедиться, если пройти в Диспетчер устройств -< Вид -< Устройства по подключению и отобразить иерархию устройств. Первым делом Windows загружает ACPI-драйвер, опрашивающий ACPI-контроллер на предмет подключенных к нему устройств, главным из которых является PCI-шина. Затем загружает PCI-драйвер и, опрашивая PCI-шину, обнаруживает новые платы расширений и прочие шины. Процесс повторяется до тех пор, пока не будут перечислены все имеющиеся устройства. Физически ACPI-шины не существует (реально весь ввод/вывод идет через PCI/AGP), и все устройства, в принципе, доступны и напрямую. При смене ACPI-ядра на не-ACPI ядро так, собственно, и происходит. Но сведения о конфигурации оборудования, содержащиеся в реестре, оказываются недействительными, отчего система тихо едет крышей и отказывается загружаться, требуя переустановки. Какие реальные выгоды дает ACPI-технология? Ну, во-первых, она полностью вытесняет Plug and Play, а вместе с ним и разборки между BIOS'ом и операционной системой по вопросам конфигурирования устройств. Теперь этого не может делать ни ось, ни BIOS, и право конфигурирования полностью отходит к ACPI. Во-вторых, ACPI при необходимости может сохранять состояние всех устройств и оперативной памяти на жестком диске, восстанавливая его при последующем включении питания. Что такое APIC APIC – Advanced Programmable Interrupt Controller (усовершенствованный перепрограммируемый контроллер прерываний). Стандартный контролер прерываний, базирующийся на микросхеме Intel 8259A или ее аналогах, поддерживает 8 линий прерываний и работает лишь в однопроцессорных системах. В IBM PC таких контроллеров всегда два, причем второй подключен на вход первого, в результате чего максимальное количество поддерживаемых прерываний увеличивается до 15. Мало? Усовершенствованный контроллер прерываний, которым оснащаются многопроцессорные системы, поддерживает до 256 прерываний, которых хватает сполна. На программном уровне PIC и APIC взаимно совместимы, поэтому APIC-ядра способны работать и с PIC-контроллерами, по крайней мере, теоретически. Практически же в некоторых конфигурациях наблюдаются глюки разной степени тяжести, иногда исправляемые очередным Service Pack'ом, иногда нет. Естественно, APIC-ядро само по себе новых линий прерываний не добавляет… INFO! В штатный комплект поставки Windows 2000 i486 ядро не входит, но его вполне реально найти в интернете или попробовать выдернуть из дистрибутива Windows XP, но никаких гарантий, что оно нормально встанет на Win2k, само собой, нет. INFO! Чипсеты VIA, SiS, ALI и RCC славятся хреновой реализацией PM-таймера (Power Management Timer), приводящего к зависанию системы или «дрыгательному» воспроизведению аудио/видеофайлов. Проблема лечится переходом на чипсеты от Intel/AMD или установкой Service Pack'а (подробнее об этом рассказывается в технической заметке Q266344 в «Базе знаний» Microsoft). INFO! Ключ /PCILOCK файла boot.ini запрещает системе использовать динамическую адресацию IO/IRQ на PCI-шине, что в некоторых случаях значительно повышает производительность, но препятствует совместному использованию системных ресурсов несколькими устройствами одновременно. Теоретически BIOS и ось должны равномерно распределять порты и прерывания между устройствами, однако на практике они нередко совершают грубые ошибки, вешая на одно прерывание несколько устройств, даже когда свободные IRQ еще не исчерпаны.
Источник: http://www.xakep.ru |