Как чертик из коробочки

Обзор Bochs, открытого эмулятора x86

[Валентин Синицын (val AT linuxcenter.ru)]

Как чертик из коробочки

Валентин Синицын (val AT linuxcenter.ru)

Впервые опубликовано в журнале "Системный администратор", N2(15), 2004.

Если вам в детстве посчастливилось иметь “бытовой компьютер“ (БК-0010, ZX Spectrum, “Корвет”, ATARI и т.д.), то вы наверняка знакомы с программами-эмуляторами, основная задача которых – шаг за шагом интерпретировать инструкции “чужого” процессора, имитировать работу периферийных устройств (монитора, клавиатуры, дисковода) с тем, чтобы на IBM PC можно было запустить программы, разработанные для других аппаратных архитектур. Однако, что мешает создать для IBM PC эмулятор IBM PC? Ответ прост – ничего! Более того, проект по его написанию был начат еще в 1994 году Кевином Лоутоном (Kevin Lawton). В течение 6 лет Bochs (произносится как английское “box”-”коробка”) распространялся как традиционный “закрытый” продукт (правда, желающие могли приобрести его исходные коды), но в 2000 году он был куплен компанией MandrakeSoft и лицензирован по LGPL (GNU Lesser General Public License). В настоящий момент сайт проекта Bochs расположен по адресу: http://bochs.sourceforge.net

С пользовательской точки зрения Bochs похож на VMWare: он также позволяет запустить на одном компьютере несколько операционных систем и “переключаться” между ними по мере необходимости. С технической точки зрения имеется существенное различие: Bochs не использует технологий виртуализацции и динамической трансляции (иными словами, он именно интерпретирует инструкции процессора, а не исполняет куски кода в native-режиме), что, с одной стороны, позволяет ему работать на платформах, отличных от x86 (в настоящий момент кроме x86 поддерживаются PPC, Alpha, Sun и MIPS), а с другой – означает меньшую скорость эмуляции (фактически, сравнительно невысокая производительность Bochs является одним из его самых существенных минусов). Bochs сам по себе является кросс-платформенным приложением: в роли так называемой “хост-системы” для него может выступать Linux, различные варианты BSD, Mac OS X, Microsoft Windows, а также BeOS и Amiga/MorphOS. “Гостевой ОС” (системой, работающей в эмуляторе) теоретически может быть все, что угодно. На сайте проекта можно найти дисковые образы для большинства систем с открытым исходным кодом: Linux, OpenBSD, FreeDOS, GNU/Hurd, и даже Minix. Операционные системы семейства Microsoft Windows также успешно работают в Bochs, но, по вполне понятным причинам, их образы не могут быть расположены в свободном доступе.

Прежде чем переходить к обсуждению возможностей Bochs, ответим на один простой вопрос: зачем он вообще нужен? В случае с эмуляторами ZX-Spectrum все ясно – они позволяют вдохнуть новую жизнь в старые добрые игры. Естественно, никто не запрещает использовать Bochs и в этих целях. Его часто применяют для запуска игр, написанных под DOS, а запуском в Bochs старых версий Linux даже занимается специальный проект “История Linux” <http://www.linuxcenter.ru/history>. Но, конечно, у Bochs есть и другие области применения. Так, его очень удобно использовать для знакомства с новыми ОС и в качестве полигона для различных экспериментов над ними. Bochs позволяет избежать малоприятной процедуры переразбиения жесткого диска и уменьшает опасность потери данных, сопутствующую опытам над реальными системами. Кроме того, при помощи Bochs можно выполнять приложения Win32 в Linux (и наоборот). Правда, для этого потребуется лицензионная копия ОС и место для хранения дискового образа. Отметим, что Bochs эмулирует работу оборудования, а не конкретной операционной системы (для этого есть dosemu, WINE и т.п.), поэтому в нем работают программы, использующие недокументированные возможности и прочие “трюки”. Отдельная (и весьма специфичная) сфера применения Bochs - отладка ядер операционных систем (о возможностях встроенного отладчика Bochs – чуть ниже). И, наконец, при помощи Bochs можно запускать приложения, написанные для x86, на других аппаратных платформах.

Возможности Bochs

Bochs эмулирует IBM-совместимый компьютер класса Pentium (имеется частичная поддержка Pentium Pro, набора инструкций MMX, а начиная с версии 2.1pre1 – SSE и AMD 3DNow!), к которому можно “подключить”:

  • видеоадаптер VGA/SVGA. Разрешение – вплоть до 1024x768x32bpp (для Bochs 2.1pre1) или 1024x768x8bpp (для более ранних версий)

  • 3.5/5.25-дюймовый дисковод. В качестве дискеты может использоваться файловый образ, а в Unix/Windows 2000 – реальный привод.

  • Жесткий диск объемом до 32Гб - в форме файлового образа. Начиная с версии 2.1pre1, Bochs поддерживает простые (flat), “разреженные” (sparse) и “растущие” (growing) образы, а также умеет откатывать (rollback) сделанные в них изменения. В Unix имеется возможность работы с реальным жестким диском (посредством файлов блочных устройств /dev/hd*), однако, этого не рекомендуется делать по соображениям безопасности.

  • Привод ATAPI-4/IDE CDROM – “компакт-диск” может быть представлен своим ISO-образом или вставлен в реальный привод.

  • Клавиатуру PS/2 и двухкнопочную мышь PS/2

  • NE2000-совместимую сетевую карту, с помощью которой гостевая ОС может связываться с другими машинами в своей локальной сети или даже выходить в Интернет

  • Звуковую карту, совместимую с SoundBlaster 16. В Linux, FreeBSD и Windows возможна работа с аудиоплатой хост-системы

  • Параллельный и последовательный порты. Вывод может перенаправляться в файл или на физическое устройство (только в Unix)

Кроме этого, Bochs поддерживает подключаемые модули-”плагины” (только в Unix и Cygwin. В форме плагинов, например, могут быть выполнены дополнительные устройства) и загрузку со всех доступных типов носителей (Floppy, HDD, CD-ROM), имитирует шину PCI (в рамках Host-to-PCI bridge и Primary Memory Controller), USB (только корневой разветвитель), SMP (Bochs может эмулировать до 15 процессоров, но в данный момент никак не использует физическую многопроцессорность хост-системы). Реализация сетевой карты в Unix-версиях Bochs имеет одну забавную особенность: в ряде случаев гостевая ОС не может связываться по сети с хост-системой. Для решения этой проблемы используются TUN/TAP-интерфейсы. Для работы с сетью в Windows требуется дополнительная библиотека WinPcap <http://winpcap.polito.it/>, которая также распространяется свободно. На всех платформах (кроме Amiga) Bochs работает в оконном (не полноэкранном) режиме. Пример окна Bochs с запущенным в нем MCC Interim Linux можно увидеть на рис. 1

Из этих “кирпичиков” можно собирать систему, удовлетворяющую требованиям конкретной задачи: указать объем оперативной памяти, настроить быстродействие (естественно, гостевая ОС в любом случае будет работать медленнее, чем в native-режиме), подобрать аппаратную конфигурацию и т.д. По умолчанию Bochs стремится работать c как можно большей скоростью, что, к сожалению, имеет свой побочный эффект - “ускорение времени” (часы в гостевой ОС начинают идти быстрее, чем в хост-системе). Во избежание этого их можно принудительно синхронизировать, правда, эта функция до сих пор помечена как “экспериментальная”.

Настройка Bochs производится до запуска – путем редактирования конфигурационного файла и во время работы – через пользовательский интерфейс. В большинстве случаев вам придется довольствоваться текстовым интерфейсом (рис. 2), хотя Bochs можно собрать с поддержкой кросс-платформенной GUI-библиотеки wxWindows <http://www.wxwindows.org>

Весьма интересной частью Bochs является также встроенный отладчик командной строки. Данный инструмент позволяет прерывать работу гостевой ОС в произвольный момент времени, изучать содержимое регистров процессора и памяти, назначать точки останова (“breakpoints”) и т.п. Это может быть полезно разработчикам операционных систем, а также всем желающим поглубже разобраться с их устройством (например, при занятии reverse engineering).

Ложка дегтя

Древнегреческий философ Платон утверждал, что осязаемые нами вещи есть суть отражения их безупречных идей. Это в полной мере относится и к программному обеспечению. Никакой продукт не свободен от недостатков, и Bochs – не исключение.

Первый, и он же основной минус виртуальной машины – это скорость работы. Bochs не слишком хорошо подходит для динамичных 3D-игр, просмотра видео и тому подобных вещей. Конечно, скорость эмуляции в каждом конкретном случае определяется возможностями хост-системы.

Второй, менее очевидный недостаток – это тип поддерживаемых устройств. Bochs (в той или иной степени) имитирует практически всю периферию, но – только стандартные (“generic”) модификации. В этом нет ничего плохого, но иногда возникает желание понаблюдать за поведением системы при использовании вполне конкретного оборудования. Так, при работе над уже упоминавшейся “Историей Linux”мы столкнулись со следующей проблемой: ранние версии сервера XFree86, которые включены в большинство старых дистрибутивов Linux, не поддерживали VESA-режимы, зато неплохо работали с видеокартами S3, Trident и т.п. Если бы Bochs имитировал работу какого-либо из этих адаптеров, мы смогли бы запустить X Window System в достаточно высоком разрешении и с хорошей глубиной цвета. В реальности же пришлось довольствоваться видеорежимом 640x480x4, что, бесспорно, лучше, чем ничего, но все же не совсем то, что хотелось бы. Радует, что данную проблему можно решить, не модифицируя исходный код Bochs, а именно, путем написания соответствующего плагина. Однако, при моделировании реально существующего оборудования возникают также некоторые юридические аспекты (не все производители hardware открыто публикуют свои спецификации), обсуждение которых выходит за рамки данной статьи.

Подведем итоги. Bochs – не слишком известный, но весьма полезный инструмент, распространяющийся свободно вместе с исходным кодом. Продукт имеет официальный статус “Beta”, однако, как показывает практика, он вполне стабилен и может оказать помощь при решении большинства задач. Это, безусловно, не панацея от проблем, возникающих при обновлении и настройке компьютерных систем, но средство сделать все необходимые операции “малой кровью”.



[ опубликовано 30/11/2004 ]

Валентин Синицын (val AT linuxcenter.ru) - Как чертик из коробочки   Версия для печати