Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #84, ДЕКАБРЬ 2005 г.

Боевое искусство портирования

Крис Касперски ака мыщъх

Хакер, номер #084, стр. 084-108-2


Да, на уровне ядра Linux/BSD отличается от Windows так же, как слонопотам от крокодила. Различий очень много, но что-то общее между ними все-таки есть. И Windows, и Linux, и BSD работают на x86-процессорах в защищенном режиме, используют страничную организацию виртуальной памяти и взаимодействуют с оборудованием в строго установленном порядке (через иерархию физических и виртуальных шин). Высокоуровневые драйвера такие, например, как ntfs.sys, вообще не касаются оборудования и содержат минимум системно-зависимого кода. Почему же тогда драйвер от одной системы не работает в другой? Главным образом, потому что интерфейс между осью и драйвером в каждом случае различен и еще потому, что драйвер использует библиотеку функций, экспортируемых системой, и эти функции у каждой системы свои.

Перенести Windows-драйвер в Linux/BSD вполне реально! Для этого даже не потребуется его исходный код. Достаточно лишь написать тонкий и несложный «переходник» между драйвером и операционной системой, принимающий запросы и транслирующий их по всем правилами «этикета», а также перетащить библиотеку функций, необходимых драйверу для работы. О, да! - для этого необходимо уметь программировать! Для простых смертных пользователей такой рецепт совершенно не годится, но тут уже ничего не попишешь. Тем не менее перенести готовый драйвер намного проще, чем переписать его с нуля. Как минимум, не потребуется проводить кропотливую работу по дизассемблированию оригинального кода, заменяющую собой поиск технической документации (которая либо совсем отсутствует, либо отдается только под подписку о неразглашении, зачастую запрещающее открытое распространение исходных текстов). К тому же, при выходе новых версий Windows-драйвера, процедура обновления Linux/BSD порта существенно упрощается, просто скопировал поверх старого файла, и все. Но все это теория. Перейдем к деталям.

Ядерная модель Windows NT и всех производных от нее операционных систем (как-то Windows 2000, XP, 2003) достаточно проста. С «внешним» миром ядро связывает Диспетчер Системных Сервисов, «подключенный» к ntdll.dll. Эта библиотека находится уже за «скорлупой» ядра и исполняется в пользовательском режиме. Диспетчер Системных Сервисов, реализованный в ntoskrnl.exe, опирается на Вызываемые Интерфейсы Ядра, часть которых реализована внутри самого ntoskrnl.exe, а часть - во внешних драйверах, к числу которых принадлежит Диспетчер Электропитания. Определенный класс драйверов, называемый Драйверами Устройств файловой системы, находится в своеобразной «скорлупе» и взаимодействует с Диспетчером Системных Вызовов через Диспетчер ввода-вывода, реализованный в ntoskrnl.exe!

Назад на стр. 084-108-1  Содержание  Вперед на стр. 084-108-3