Основы ядерной инженерии Крис Касперски Xakep, номер #068, стр. 068-024-5 Внутри ядра Существуют ли теоретические обоснования того, почему i486 ядро увеличивает быстродействие компьютера? Да, существуют. И хотя до сих пор не ясен конкретный вклад каждого из них, общая картина событий выглядит скорее тривиальной, чем удивительной. Начнем с того, что поддержка многопроцессорности не проходит бесследно и налагает на архитектуру ядра определенный отпечаток, заставляя его решать те задачи, которые на однопроцессорных машинах просто не возникают. Взять хотя бы проблему когерентности, т.е. согласованности данных. Представь себе, что произойдет, если один процессор обратится к недостроенной структуре данных, конструируемой другим процессором. Чтобы этого избежать, в каждый момент времени только один процессор может модифицировать данные, а остальные блокируются при помощи спинлуков (от английского spin lock – взаимоблокировка). В однопроцессорных системам спинлуки лишены смысла и должны заменяться на NOP'ы, однако, в Windows этого не происходит, и большую часть отведенного ему процессорного времени ядро расходует именно на спинлуки. Хуже того! Алгоритмы, эффективно исполняющиеся на двух или даже четырех процессорах, далеко не всегда сохраняют свою эффективность на одном. Судя по всему, во времена 486 процессоров Microsoft поддерживала независимые линейки ядер, оптимизируя каждое из них по отдельности. Когда же аппаратные возможности персональных компьютеров возросли, она с облегчением свела все ядра воедино. Дизассемблирование доказывает, что однопроцессорная версия ядра практически во всем повторяет многопроцессорную и работает намного медленнее, чем могла бы. Другой источник тормознутости – это пресловутый Plug and Play. Древние ядра самостоятельно обслуживали шины, DMA и прочие системные устройства, за каждым из которых жестко закреплялось свое пространство адресов ввода-вывода, свой IRQ и свой канал DMA. Теперь же все значительно усложнилось и… затормозилось. Ядро абстрагировалось от конкретного оборудования и перешло на виртуальные шины, эмулируемые драйверами соответствующих устройств. Изменилось все, включая схему обработки прерываний. Это раньше диспетчер знал все прерывания в лицо, а теперь он вынужден постоянно обращаться к базе данных, выясняя, какой вектор какому устройству принадлежит (ведь системные ресурсы могут динамически переназначаться во время работы). Как уже говорилось, ядро состоит из библиотеки аппаратных абстракций и исполнительной системы. Архитектурно библиотека аппаратных абстракций включает в себя набор системно зависимых функций, на которые опирается системно независимое ядро, реализующее базовые сервисы операционной системы. При переносе оси на другую платформу в принципе достаточно переписать один лишь HAL, не трогая все остальное. Это в теории. На практике же, во-первых, всякий перенос требует радикальной переделки всей системы, а во-вторых, на сегодняшний день Windows 2000, XP и 2003 существуют всего лишь на одной платформе – платформе IBM PC, и потому по ряду соображений HAL и исполнительная система тесно переплетены. |