Основные понятия:

Виртуалная машина — широкий термин, покрывающий все системы, предоставляющие виртуальное окружение поверх некоторого отличного реального.
К наиболее известным видам виртуальных машин можно отнести виртуальные машины языков высокого уровня (например, виртуальная машина Java) и полносистемные виртуальные машины (например, Virtual Box).
Динамическая двоичная трансляция — метод выполнения машинного кода, скомпилированного для одной процессорной архитектуры на другой, возможно отличной, процессорной архитектуре. Выполнение в этом случае включает трансляцию кода небольшими фрагментами во время выполнения.

Направления, по которым ведутся работы в группе:

Оптимизация производительности динамической двоичной трансляцииТрансляция кода — дело не быстрое. Трансляция двоичного кода — дело не быстрое вдвойне. Но пользователи не любят ждать, пока их приложение откроется, а часть приложений строго требует некоторую минимальную производительность для корректной работы (иначе они всегда занимаются тем, что обрабатывают какие-нибудь периодические события).
Вопрос производительности динамической двоичной трансляции содержит много подзадач, которые не встречаются в обычных компиляторах. Кроме того, при динамической двоичной трансляции как правило полностью отсутствует высокоуровневая информация о программе.
Разработка инструментов анализа бинарного кода на базе виртуальных машинДинамическая двоичная трансляция предоставляет широкие возможности по анализу двоичного кода. Во время трансляции код можно инструментировать, то есть добавить туда небольшие фрагменты, которые будут собирать какую-нибудь информацию времени выполнения.
Самое известное приложение, использующее такой подхода — это Valgrind. Valgrind добавляет в программу различные проверки, которые позволяют выявлять сложнообнаружимые ошибки.
В ИСП РАН разрабатывается целая платформа по полносистемному анализу двоичного кода на базе эмулятора QEMU.
Использование физических устройств изнутри виртуальной машиныПорой для работы анализируемой программы требуется специальная аппаратура. Эта аппаратура может быть очень сложной для программной эмуляции. Или от нее может требоваться недостижимая программными средствами производительность.
В этом случае можно задействовать механизм проброса реальной аппаратуры внутрь виртуальной машины. Так можно, например, передать виртуальной машине видеокарту и получить там полностью работающую аппаратную 3D графику.
Проброс устройств очень сильно зависит от типа устройства и интерфейса подключения.
Специализированные программные инструменты для разработки виртуальных машинРазработка виртуальных машин — дело интересное, но в нем встречаются скучные повторяющие задачи. Вместо того чтобы каждый раз тратить много времени на их решение, можно написать средства автоматизации повторяющихся шагов.
К частым подзадачам, решаемым «по шаблону», относятся: реализация поддержки новой аппаратной архитектуры и реализации поддержки новой аппаратной платформы. Эти задачи сводятся к необходимости взять документацию и перевести ее с английского на Си.
В ИСП РАН разрабатывается набор инструментов Qemu Development Toolkit, упрощающий этот перевод.
Применение аппаратной виртуализации для анализа бинарного кодаХорошо оптимизированная динамическая двоичная трансляция может приблизиться к производительности реальной аппаратуры, но никогда не сможет ее достичь.
Средства аппаратной виртуализации, предоставляемые современными процессорами, обеспечивают производительность едва отличимую от реальной аппаратуры. Однако они не дают таких возможностей по анализу состояния программы в каждой точке, как динамическая двоичная трансляция.
Совместить сильные стороны двух подходов в одном — перспективное направление будущих исследований.

Навыки, приобретаемые студентами:

  • Углубленное понимание взаимодействий между операционной системой и аппаратурой, между прикладной программой и операционной системой.
  • Умение анализировать производительность программ, находить и устранять узкие места.
  • Знания о процессорных архитектурах и операционных системах.
  • Базовые знания о компиляторных оптимизациях.