XENnCo

аппаратная виртуализация\\ или эмуляция без тормозов

крис касперски ака мыщъх, no-email

интерес к различного вида эмуляциям все растет и растет (кому не интересно запустить из-под Windows это загадочный LINUX или полюбоваться Mac OS?). единственный сдерживающий фактор это — (не)производительность. эмуляторы так тормозят… и вот в середине 2006 года в процессорах Intel и AMD наконец-то появилась аппаратная поддержка виртуализации, снижающая накладные расходы на эмуляцию в сотни раз! новая технология уже поддерживается VM Ware 5.5, XEN'ом и рядом других продуктов о которых мы сейчас и поговорим

Лет пятнадцать-двадцать назад, в эпоху перехода с 8-битного потребительного барахла типа РК86, ZX Spectrum на серьезный (по тем временам) IBM PC XT/AT, ностальгирующие разработчики, не желающие расставаться со старой техникой, писали эмуляторы, растущие как грибы после дождя и позволяющие всем желающим играть в свои любимые игры, прямых аналогов для которых на IBM PC не существовало.

Через десять лет история повторилась: операционные системы семейства NT, ставшие стандартом де-факто, заблокировали прямой доступ к оборудованию и 90% игр тут же отказались запускаться (или теряли звуковое сопровождение). Ответом турецкому султану стал DOSBox и другие эмуляторы, позволяющие обратить время вспять и вспомнить свою былую молодость, прошедшую в окровавленных коридорах DOOM II. Однако, даже на P-III 733 старый добрый Aladdin шел на пределе, с пропуском кадров, не говоря уже про более серьезные игры. Наращивать мощность было невыгодно — проще купить старый компьютер, водрузить на него MS-DOS и наслаждаться играми без внезапных вылетов эмулятора, рывков и тормозов.

Рисунок 1 Aladdin, запущенный пот эмулятором DOSBox

Идея эмулировать IBM PC на самом IBM PC родилась не вдруг и не сразу, но тут же завоевала расположение хакеров, системных администраторов и просто любопытствующих. Теперь всплывающий soft-ice не замораживал компьютер, позволяя отлаживать программу с одновременным чтением документации. Для экспериментов с вирусами уже не приходилось переключаться на специальный жесткий диск и, самое главное, поставить LINUX/BSD мог любой желающий, не рискуя угробить основной Windows раздел.

К сожалению, для полноценной работе с LINUX'ом на эмуляторе требовалась очень мощная машина, да и то в KDE/GNOME приходилось отключать все спецэффекты чтобы не так сильно тормозило.

Поддержка аппаратной виртуализации со стороны процессоров — это настоящий прорыв, позволяющий гонять гостевые операционные системы с той же скоростью, с какой они исполнялись бы на живом железе! Но не будем забегать вперед, а расскажем обо всем по порядку.

Рисунок 2 какой из этих пингвинов реальный, а какой — настоящий?

Вслед за возникновением концепции многозадачности, появилась идея виртуализации, выдвинутая в 1974 году Геральдом Попеком (GeraldPopek) совместно с Робертом Голдбергом (RobertGoldberg) и описанная ими в статье «FormalRequirementsforVirtualizableThirdGenerationArchitectures» (http://doi.acm.org/10.1145/361011.361073).

Чтобы запускать несколько операционных систем одновременно, процессор должен поддерживать виртуальную память и обладать раздельными уровнями привилегий согласованными с набором команд. Программа, называемая Монитором Виртуальных Машин (VirtualMachineMonitor или, сокращенно, VMM), запускалась бы на наивысшем уровне привилегий, перехватывала выполнение привилегированных инструкций (пытающихся обратится к физической памяти или портам ввода/вывода, например) и эмулировала их выполнение. Непривилегированные инструкции в этой схеме выполняются на «живом» железе без потери скорости, а, поскольку, процент привилегированных инструкций относительно невелик, накладными расходами на эмуляцию можно полностью пренебречь.

Из всех, существующих на тот момент машин, данным критериям отвечали только IBM System/370 и Motorola MC68020 на которых и были реализованы эффективные эмуляторы, позволяющие, в частности, создавать виртуальные сервера, обслуживающие разных пользователей или просто дублирующие друг друга. Если падает один сервер, инициативу тут же подхватывает другой и для этого совершенно не нужно держать несколько _физических_ серверов! (Выход из строя самого сервера не рассматривается, поскольку операционные системы наворачиваются _значительно_ чаще).

Рисунок 3 виртуальные сервера, реализованные на базе IBM System/370

А как же процессоры семейства Intel 80386? Они поддерживают виртуальную память и разделение привилегий по целым четырем кольцам защиты. Что мешает реализовать на них полноценный эмулятор, такой же как и на IBM System/370?! Увы, «BigIron» потому и «BigIron», что его проектировали головой! Начнем с того, что все операционные системы, какие только имеются на IBM PC, помещают свои ядра в нулевое кольцо, на которое понятие привилегированных команд не распространяется. Следовательно, монитор виртуальных машин уже не может их перехватывать.

Правда, существует лазейка — устанавливаем некоторую операционную систему, объявляя ее базовой или основной (host), и запускаем все остальные оси… в третьем кольце! Тогда привилегированные инструкции станут возбуждать исключения, легко перехватываемые монитором виртуальных машин, работающим в нулевом кольце, но… тут не все так легко, как кажется!

Инструкции LGDT, LLDT и LIDT, загружающие во внутренние регистра процессора указатели на глобальные/локальные таблицы дескрипторов сегментов и прерываний совершенно не приспособлены для одновременной работы с несколькими операционными системами, поскольку существуют в единственном числе. Таблицы дескрипторов сегментов хранят линейные адреса и атрибуты каждого из сегментов, причем дескриптор представляет собой 16-разрядное число, загружаемое в сегментный регистр CS, DS, SS и т. д. С таблицей дескрипторов прерываний — та же самая картина. Гостевая ось не может использовать «хозяйские» таблицы дескрипторов по той простой причине, что селекторы сегментных регистров жестко прописаны внутри самой оси и если, Windows грузит в регистр DS селектор 23h (а она действительно грузит его), становится непонятно, что делать всем остальным?!

Существует единственный выход — для каждой из виртуальных машин создавать свою собственную копию таблиц дескрипторов, переключая их при переходе с одной виртуальной машины на другую, а это тормоза. Но это еще что! Инструкции SGDT/SLDT и SIDT, считывающие значения внутренних регистров процессора, не являются привилегированными, в результате чего гостевая ось читает таблицу дескрипторов основной оси вместо своей собственной! Тоже самое относится и к инструкции SMSW, считывающие значение командного слова процессора, в которое, в частности, попадают биты из регистра CR0, который гостевая ось не должна видеть.

Инструкции POPF/POPFD сохраняют содержимое регистра EFLAGS в памяти без генерации исключения, и хотя попытка модификации привилегированных полей EFLAGS'а приводит к исключению, это не спасает ситуацию. Допустим, гостевая ось заносит в EFLAGS значение X, затрагивающее одно или несколько привилегированных полей. Процессор генерирует исключение, эмулятор перехватывает его и имитирует запись, подсовывая гостевой системе «виртуальный» EFLAGS. Однако, чтение EFLAGS, не являясь привилегированной инструкцией, возвращает его _немодифицированное_ содержимое, и вместо ожидаемого X ось видит Y.

С инструкциями LAR, LSL, VERR и VERW дела обстоят еще хуже, поскольку они _по_ _разному_ работают в привилегированном и непривилегированном режиме. В непривилегированном режиме исключения не возбуждается, но инструкция возвращает совсем не тот результат, который от нее ожидали.

Вот неполный перечень причин, делающих платформу x86 непригодной для эффективной виртуализации (подробнее об этом можно прочитать в статье «Proceedings of the 9th USENIX Security Symposium», лежащей на http://www.usenix.org/events/sec2000/robin.html).

Непригодность x86 архитектуры для эффективной виртуализации еще не запрещает эмулировать IBM PC _программно_ с минимальной поддержкой со стороны оборудования. В грубом приближении это будет интерпретатор, «переваривающий» машинные команды с последующей имитацией их выполнения. С 8086 никаких проблем не возникает, но вот эмуляция страничной организации памяти и прочих 386+ штучек не только усложняет кодирование, но и снижает скорость выполнения программы в сотни или даже тысячи раз!

Одним из таких эмуляторов и является знаменитый BOCHS, создающий виртуальный компьютер с полным комплектом «оборудования» на борту и способный эмулировать двухпроцессорную (или даже четырехпроцессорную!) машину даже при наличии всего одного физического процессора. Кроме того, это единственный эмулятор, поддерживающий x86-64 архитектуру, работающую поверх x86!

Полные исходные тексты можно бесплатно скачать с http://bochs.sourceforge.net, там же лежат и готовые бинарные сборки для Windows и LINUX. К сожалению, чтобы запустить на BOCHS'е Windows 2000 потребуется очень мощный процессор, самый мощный, который только можно купить, но и в этом случае все будет очень сильно тормозить.

Рисунок 4 x86-64 версия Debian'а, запускаемая на x86-процессоре под эмулятором BOCHS

На основе BOCHS'а был создан другой замечательный эмулятор — QEMU, использующий режим динамической эмуляции, увеличивающей производительность в десятки раз. Не вдаваясь в технические подробности достаточно отметить, что QEMU как бы «компилирует» машинный код и при повторном выполнении он исполняется на «живом» железе на полной скорости. В циклах это дает колоссальный выигрыш!

Правда, общая производительность все равно оставляет желать лучшего, да и стабильность (в силу технических сложностей реализации динамической эмуляции) прихрамывает. Некоторые программы вообще не запускаются (особенно игрушки), некоторые периодически вылетают. Тем не менее, QEMU легко тянет LINUX/BSD без графической оболочки и ряды его поклонников неуклонно растут. Свежую версию всегда можно бесплатно скачать с http://fabrice.bellard.free.fr/qemu.

Перефразируя древнюю поговорку: «нельзя — это если нет денег, а с деньгами, особенно с большим их количеством, все возможно». Осознав какие рыночные перспективы открывает создание качественного эмулятора, 8 февраля 1999 года копания VM Ware представила революционный продукт «VM WareVirtualPlatform», основанный на исследованиях Стэндфордского Университета и запатентованный в мае 2002 года под номером «U. S. Patent 6.397.242». Сам текст патента со всеми техническими деталями можно найти на http://patft.uspto.gov/netacgi/nph-Parser?patentnumber=6,397,242 (бесплатно).

Для достижения эффективной скорости эмуляции на x86, разработчики VM Ware использовали ряд хитрых трюков, требующих тесного взаимодействия с ядром основной оси и, что хуже всего, накладывающих довольно жесткие ограничения на гостей. Полной виртуализации добиться так и не удалось, реально имитируется лишь относительно небольшая часть возможностей x86, а остальные приводят к аварийному завершению гостевой оси или работают не так, как предполагалась. Производительность сокращается уже не в сотни, а всего лишь в десятки раз, обеспечивая комфортную работу с Windows 2000 уже на Pentium-III, однако, поиграть в игрушки или посмотреть видеофильм — увы, не получится.

Рисунок 5 Windows 2000, запущенная под WM Ware

Аналогичную схему виртуализации использует и Virtual PC, явно уступающий своему конкуренту в (не)полноте эмуляции. В частности, отладчик soft-ice, великолепно работающий под VM Ware, на Virtual PC просто не идет. Тем не менее, под Virtual PC лучше работают игрушки, не требующие быстрого процессора и мощной видео-карты, но вот со звуком там серьезные проблемы…

Оба продукта являются коммерческими и распространяются на платной основе. Плюс еще возникает довольно щекотливый вопрос о необходимости лицензирования Windows (и другого ПО) для каждой виртуальной машины, на которой она установлена. С юридической точки зрения все ОК, поскольку операционные системы до сих пор лицензируются под _физические_ машины, что вполне логично, но вот мерзкая защита, встроенная в Windows, требует активации при смене всех трех ключевых компонентов — процессора, жесткого диска и видео-карты, а на виртуальной машине они… естественно виртуальные и совсем не совпадающие с реальными. Правда, VM Ware, выполняющая команду CPUID «в живую», показывает процессор таким, какой он есть, избавляя нас от необходимости платить за одну и ту же копию Windows помногу раз подряд.

Пробиваясь на рынок мощных серверов, компании Intel и AMD разработали технологии аппаратной виртуализации, грубо говоря, добавив дополнительное кольцо защиты, работая в котором, гипервизор может перехватывать все события, требующие внимания с его стороны. В практическом плане это означает, что эмулятору теперь незачем «извращаться» и производительность виртуальных машин достигает порядка ~90% производительности основного процессора, что выглядит слишком заманчиво и вызывает непреодолимое желание заполучить эту штуку как можно скорее.

Что же для этого нам понадобиться? В первую очередь «правильны» кремний. Аппаратную виртуализацию поддерживают следующие модели процессоров Intel: Pentium 4 6×2, Pentium D 9xx, Xeon 7xxx, Core Duo и Core 2 Duo (технология Vanderpool), а так же Itanium (технология Silvervale). Все процессоры фирмы AMD, выпущенные после мая 2006 года на сокетах SocketAM2, SocketS1 и SocketF (Athlon 64, Turion 64 и, начиная с августа 2006 — Opteron) так же поддерживают технологию аппаратной виртуализации с кодовым именем Pacifica. (впрочем, официально эти технологии официально именуются VT-X и AMD-V соответственно).

Естественно, к процессору понадобиться материнская плата и, возможно, обновленная версия BIOS. Некоторые BIOS позволяют включать/выключать поддержку аппаратной виртуализации и на некоторых из них по умолчанию она почему-то выключена.

ОК, железо куплено, собранно, настроено и готово к работе. Теперь очередь за ПО.

Разработчики эмуляторов активно включаются в игру, подтягивая свои штаны к новейшим достижениям прогресса и так, или иначе, через некоторое время все они будут использовать технологию аппаратной виртуализации. В стороне останутся только экзотические эмуляторы типа BOCHS'а, поскольку никакая аппаратная виртуализация не позволит эмулировать четырехпроцессорную машину на однопроцессорной, а ведь это кому-то нужно.

Поскольку, желающих платить среди нас, как я понимаю, что-то не наблюдается, в первую очередь рассмотрим некоммерческие продукты, тем более, что по своим функциональным возможностям они значительно превосходят своих конкурентов. Ирония судьбы или… Ладно, не будет гадать.

XEN

Проект XEN – детище некоммерческой организации XenCommunity, возглавляемой Яном Праттом (IanPratt) из XenSource, Inc. — появился задолго до «изобретения» аппаратной виртуализации и широко использовался такими компаниями IBM, Hewlett-Packard в своих майнфреймах для организации выделенных виртуальных серверов — virtualdedicatedservers, (подробнее о которых можно прочитать на http://en.wikipedia.org/wiki/Virtual_dedicated_server), что говорит о высокой надежности и качестве данного продукта, проверенного временем и помимо x86 поддерживающего x86-64, IA64, PPC и SPARC.

Рисунок 6 гостевые операционные системы, запущенные под эмулятором XEN

Правда, на процессорах, не поддерживающих технологию аппаратной виртуализации, требуется модификация ядра гостевой операционной системы, взаимодействующей с гипервизором посредством предоставляемого им набора API-функций. С открытыми операционными системами (xBSD, Linux) в этом плане никаких проблем не возникает, а вот Windows XP удалось перенести на XEN исключительно в рамках проекта «Microsoft'sAcademicLicensingProgram», позволяющим хачить ядро Windows в академических целях. Несмотря на то, что перенос осуществлялся при активном участии MicrosoftResearch в тесном сотрудничестве с группой UniversityofCambridgeOperatingSystem, условия лицензионного соглашения не позволяют распространять порт XP ни под каким соусом. Тем не менее, технические детали переноса детально описаны в документации на XEN и при жгучем желании помноженном на избыток свободного времени этот фокус может повторить любая хакерская группа. Или воспользоваться готовым портом, просочившимся в Осла. Но смысл?!

С поддержкой аппаратной виртуализации со стороны процессора, XEN позволяет запускать гостевые системы _без_ какой либо их модификации (а XEN поддерживает все три технологии виртуализации: Pacifica, Vanderpool и Silvervale). Зачем ограничатся XP, когда вокруг существует виста, Server Longhorn и горячо любимая мыщъх'ем w2k с которой он так и не слез и слезать не собирается untiltheconclusionofthesystemofthings.

В роли базовой оси может выступать Linux, NetBSD или FreeBSD (последняя поддерживается в ограниченном режиме). XEN входит в состав множества дистрибутивов, в том числе и в Debian. Существует и коммерческие версии XEN'а, например, NovellSLES10 или RedHatRHEL5. Что же касается Windows, то в список базовых осей, поддерживаемых XEN'ом, она не входит и ставить LINUX/NetBSD все-таки придется. Собственно говоря, ничего страшного в этом нет, зато потом, поверх него можно будет запустить множество гостевых Windows всех версий, какие только заблагорассудится.

Рисунок 7 официальный сайт эмулятора XEN

Другой вариант — воспользоваться Live CD, который можно бесплатно скачать с: http://bits.xensource.com/ISO/latest/xen-3.0-demo-livecd-3.0.iso. Сами же исходные тексты XEN'а лежат на его страничке: www.cl.cam.ac.uk/research/srg/netos/xen. Как говориться, выбирай — не хочу. Тем более, что и выбирать-то не из чего (почему «не из чего» через несколько минут станет понятно).

VMWare

Начиная с версии 5.5 VM Ware поддерживает технологию аппаратной виртуализации Vanderpool, позволяющую ей запускать 64-битные гостевые операционные системы на x86 процессорах, однако, для 32-битных гостей аппаратная виртуализация по умолчанию _выключена_ поскольку реализована настолько криво, что вместо обещанного ускорения дает _замедление_ подробное разъяснение причин которого можно почерпнуть из статьи «AComparisonofSoftwareandHardwareTechniquesforx86 Virtualization», написанной двумя сотрудниками VMWare — Кейзом Адамсом (Keith Adams) и Олом Агесеном (Ole Agesen) и выложенной на: www.vmware.com/pdf/asplos235_adams.pdf.

Заставить VM Ware использовать аппаратную виртуализацию в принудительном порядке поможет строка «monitor_control.vt32 = «TRUE»», добавленная в *.vmx файл соответствующей виртуальной машины. Только большой пользы от нее не будет.

Последнюю версию VM Ware можно скачать с фирменного сайта www.vmware.com или напрячь Осла.

…и все-все-все

Помимо двух вышеописанных фаворитов рынка существует множество других эмуляторов, поддерживающих аппаратную виртуализацию или собирающихся сделать это в ближайшее время, например: MicrosoftVirtualPC (денег не просит, но пока ничего толком и не поддерживает), MicrosoftVirtualServer 2007 планирует поддерживать технологии Pacifica и Vanderpool (текущая бета MicrosoftVirtualServer 2005 R2 SP1 их уже поддерживает), ParallelsWorkstation — легкий гипервизор/монитор виртуальных машин, поддерживающий Vanderpool и занимающий всего 13.7MB в Windows-версии и 9.7MB в версии, использующей в качестве основной системы Linux. Все это удовольствие стоит чуть меньше полусотни долларов и оно того действительно стоит: www.parallels.com и www.answers.com/topic/parallels-workstation.

Рисунок 8 внешний вид эмулятора Parallels

Так же существуют экзотические супервизоры типа TRANGO, ориентированные на решение задач реального времени, например, обрабатывающие быстроменяющиеся показания датчиков или что-то еще.

Виртуальность ‑ это по настоящему крутая вещь! Можно экспериментировать со всеми операционными системами, которые только есть, тянуть виртуальные сети, а потом пытаться их взломать, наблюдая за реакцией брандмауэров и всяких прочих систем обнаружения вторжения.

Раньше, для реализации сетевых атак требовалось иметь от трех до пяти компьютеров, теперь же достаточно одного! Причем без тормозов! Ведь самый ценный ресурс (не считая мозгов) — это время, которого всегда не хватает. Увеличивая производительность компьютера мы удлиняем нашу жизнь!