Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #51, ФЕВРАЛЬ 2005 г.

Из Windows в *nix

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

Спецвыпуск: Хакер, номер #051, стр. 051-086-2


Слои абстрагирования

Если нужно быстро перенести программу – воспользуйся WINE или Willows. Это бесплатно распространяемые имитаторы Windows, оборачивающие *nix-функции толстым слоем переходного кода, реализующего Win32 API и работающие на: Windows 9x/NT/2000/XP, Linux, FreeBSD, Solaris, а Willows еще и на QNX.

Обрати внимание: не эмуляторы, а именно имитаторы (WINE именно так и расшифровывается: Wine Is Not Emulator – это вам не эмулятор). Портируемая программа исполняется на "живом" процессоре практически без потерь в скорости. Во всяком случае реклама говорит именно так. А что реальная жизнь? При всей схожести *nix и Windows NT (их ядра наследуют общий набор концепций) они во многом различаются. В *nix есть замечательная функция Fork, расщепляющая процесс напополам. В NT ее нет. Функциям CreateProcess/CreateThread далеко до Fork. И вот почему. Накладные расходы на расщепление процесса ничтожны, чего нельзя сказать о создании процесса/потока с нуля. Кстати, с потоками в Linux сплошной напряг; внутренние потоки представляют те же процессы, но только немного усложненные. Всегда заменяй CreateThread на Fork, когда это только возможно (процессы, в отличие от потоков, исполняются в различных адресных пространствах и могут обмениваться данными только через IPC, например, так происходит с проецированными в память файлами). К тому же средства синхронизации потоков в Windows и *nix далеко не как две капли воды, а в Linux-синхронизация не поддерживается вовсе и реализуется внешними библиотеками. Все это делает отображение Win32 API на *nix-функции неоднозначным, и выбор предпочтительного системного вызова в каждом конкретном случае должен определяется индивидуально. Человеком. Имитатор на это не способен, и падения производительности не избежать (другое дело, что при современных аппаратных мощностях о производительности можно не вспоминать).

Конструктивно большинство имитаторов состоят из двух основных компонентов: бинарного интерфейса (Binary Interface) и библиотеки разработчика (Library). Некоторые имитаторы (например, Willows) включают еще и уровень абстрагирования от платформы (Platform-abstraction Layer), что упрощает их перенос на другие системы, но это уже детали реализации.

Бинарный интерфейс включает в себя win32-загрузчик, "переваривающий" PE-файлы и с максимальной точностью воссоздающий привычное для них окружение. Необходимость в перекомпиляции при этом отпадает, однако совместимость остается на очень низком уровне. Реально удается запустить лишь небольшое количество офисных приложений типа Office, Acrobat или Photoshop. Системные утилиты, скорее всего, откажутся работать, и тут на помощь приходит библиотека – заголовочные файлы плюс lib-файл. Адаптировав приложение, можно компилировать его как в ELF (тогда необходимость иметь на машине установленный имитатор отпадает) или в PE. Красота!

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