Одним из перспективных направлений разработки системного ПО в настоящее время является виртуализация аппаратных платформ. Такой способ виртуализации позволяет запускать на одном физическом компьютере несколько экземпляров ПО, требующего исключительного доступа к оборудованию (в частности, несколько операционных систем), за счет чего достигается высокая безопасность и изолированность запущенных приложений. Также это является наиболее надежным способом одновременного запуска приложений, требующих для своей работы разные операционные системы. При этом не требуется специальная модификация ПО для работы в виртуализированной среде, что является основным преимуществом такого способа виртуализации. Задача виртуальной машины (ВМ) - исполнение гостевого машинного кода в окружении, неотличимом от физического компьютера. Процесс, обеспечивающий такое исполнение, называется «монитор виртуальной машины» (VMM). Здесь и далее термин «гость» (англ. «guest») используется в значении «система, исполняющаяся внутри виртуальной машины» и противопоставляется «хосту» (англ. «host») - системе, исполняющей процесс виртуальной машины. Целью данной работы была разработка эффективного эмулятора центрального процессора архитектуры (как набора команд, ISA) ARMv7, способного работать в пространстве пользователя на хост-системе той же архитектуры. Под такой работой понимается отсутствие необходимости в исполнении привилегированного кода в ОС хоста, что часто бывает затруднено ввиду невозможности получения привилегий администратора. Стандартным подходом к виртуализации аппаратных платформ является метод «trap-and-emulate». Этот подход применим только в том случае, если архитектуры гостевой и физической системы совпадают. При его использовании гостевой машинный код исполняется на физическом процессоре без каких-либо модификаций, но в непривилегированной среде (отдельным процессом под управлением ОС хоста). Однако, это требует, чтобы VMM исполнялся в режиме ядра, что сопряжено с большими накладными расходами на переключение контекстов, значительно снижая производительность ВМ. Для решения описанных проблем применяется бинарная трансляция гостевого кода. Бинарная трансляция - метод эмуляции, при котором гостевой машинный код модифицируется непосредственно перед исполнением на процессоре хоста. При этом становится возможным обнаруживать и обрабатывать проблемные инструкции еще до их исполнения, не прибегая к медленному аппаратному перехвату. Обращения к гостевой памяти, включая команды ветвления, можно таким же образом подвергнуть преобразованию адресов, что полностью исключит необходимость иметь части VMM в пространстве ядра. Остальные инструкции не требуют качественных изменений (т. е. эмуляции) и могут быть выполнены «как есть». В настоящий момент не существует эффективных реализаций VMM для архитектуры ARM, работающих в пространстве пользователя. Существует проект QEMU с открытым исходным кодом, реализующий этот функционал за счет использования промежуточного представления машинного кода. Однако такой подход не является эффективным и в основном пригоден для использования в исследовательских целях. Разработанный бинарный транслятор предназначен для работы с машинным кодом конкретной архитектуры, причем трансляция происходит в ту же самую архитектуру. Вследствие этого становится возможным достичь высокой эффективности. Согласно исследованию, проведенному VMware, использование бинарной трансляции для обработки доступов к памяти менее оптимально, чем использование теневых таблиц страниц. Тем не менее, первый метод позволяет оставаться в пределах пространства пользователя, что и явилось причиной его выбора в данной работе. Накладные расходы на бинарную трансляцию складываются из необходимости транслировать гостевой машинный код по мере его исполнения. Вследствие этого трансляция осуществляется частями и прерывается по достижению неподдерживаемой команды или команды безусловного перехода. Между исполнениями таких блоков состояние гостевого процессора сохраняется в памяти, и некоторое количество времени затрачивается на синхронизацию этого состояния с регистрами физического процессора. Процесс самой трансляции является ресурсоемким, и повторять его при каждом исполнении одних и тех же инструкций недопустимо. Вследствие этого в данной работе применяется кэширование результатов трансляции при помощи ассоциативной структуры данных (многоуровневой хэш-таблицы), сопоставляющей результаты трансляции блоков инструкций начальным адресам этих блоков. Также был разработан механизм проверки корректности трансляции, при котором каждый блок инструкций исполняется дважды - на эталонном программном эмуляторе и посредством выполнения сгенерированного кода. Если действия, совершаемые во время этих проходов, совпадают, то можно утверждать, что трансляция корректна. В настоящий момент бинарный транслятор находится в состоянии прототипа и ведется активная его разработка. Присутствует поддержка большинства непривилегированных инструкций набора команд ARM (исключением являются команды ветвления). В ближайшее время планируется реализовать трансляцию оставшихся команд ARM, после чего провести ряд отложенных оптимизаций и усовершенствований, что позволит проекту превзойти существующие решения (в частности, QEMU) по производительности. Работа была выполнена на языке C++, в среде KDevelop 4, в операционной системе Linux. Объем кода составляет около 10000 строк. Список литературы[1] Gerald J. Popek, Robert P. Goldberg. Formal requirements for virtualizable third generation architectures, Communications of the ACM Volume 17 Issue 7 1974 (http://www.logos.ic.i.u-tokyo.ac.jp/~tau/lecture/os/gen/papers/p412-popek.pdf). [2] Fabrice Bellard. QEMU, a Fast and Portable Dynamic Translator, Proceedings of the USENIX Annual Technical Conference 2005. (https://www.usenix.org/legacy/event/usenix05/tech/freenix/full_papers/bellard/bellard.pdf). [3] Keith Adams, Ole Agesen, VMware. A comparison of software and hardware techniques for x86 virtualization, Proceedings of the ASPLOS Conference 2006 (http://www.vmware.com/pdf/asplos235_adams.pdf). [4] Procedure Call Standard for the ARM Architecture, 2012. (http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf). [5] ARM Architecture Reference Manual, 2012. [6] Материалы сайтов gotw.ca/gotw и stackoverflow.com. Научные руководители: А.Б. Корякин (Parallels), И.Р. Дединский (МФТИ).
|