После года разработки вышел эмулятор QEMU 6.0


    Прошел ровно год с момента выхода эмулятора QEMU 5.0, и сейчас разработчики представили новую версию. Проект дает возможность запустить программное обеспечение, подготовленное для одной архитектуры, на аппаратной платформе с другой архитектурой.

    Пример — выполнение приложения для ARM на ПК с процессором x86. Благодаря особенностям эмулятора приложение в изолированном окружении выполняется почти с той же эффективностью, что и в нативном окружении. Достигается это, в частности, за счет прямого выполнения инструкций на процессоре, а также за счет применения гипервизора Xen или модуля KVM. Сейчас эмулятор поддерживает 14 аппаратных архитектур и может эмулировать около 400 разных устройств. За год разработчики внесли свыше 3 тысяч изменений от 268 разработчиков.

    Подробнее о ключевых изменениях


    Понятно, что объем статьи не позволит внести все 3 тысячи изменений, поэтому ограничимся ключевыми, наиболее важными:

    • Эмулятор контроллеров NVMe теперь приведен к полному соответствию со спецификацией NVMe 1.4. Также он получил экспериментальную поддержку нескольких новых фич, включая зонированные пространства имен, multipath I/O и сквозное шифрование данных на накопителе.
    • Кроме того, добавлены экспериментальные опции "-machine x-remote" и "-device x-pci-proxy-dev", которые нужны для выноса эмуляции устройств во внешние процессы. В текущем режиме эмулятор поддерживает пока лишь SCSI-адаптер lsi53c895.
    • Есть экспериментальная поддержка снапшотов содержимого ОЗУ.
    • Появился новый FUSE-модуль, который необходим для экспорта блочных устройств. Он дает возможность примонтировать срез состояния практически любого блочного устройства, которое используется в гостевой системе. Экспорт при этом реализуется благодаря QMP-команде block-export-add или через опцию "--export" в утилите qemu-storage-daemon.
    • Важное обновление получил эмулятор архитектуры ARM — так, добавлены архитектуры ARMv8.1-M 'Helium' и процессоров Cortex-M55, а также расширенных инструкций ARMv8.4 TTST, SEL2 и DIT. А еще появилась поддержка ARM-плат mps3-an524 и mps3-an547, плюс добавлена дополнительная эмуляция устройств для плат xlnx-zynqmp, xlnx-versal, sbsa-ref, npcm7xx.
    • Что касается режимов эмуляции на уровне системы для ARM, то здесь появилась поддержка расширения ARMv8.5 MTE (MemTag, Memory Tagging Extension). Оно позволяет привязать теги к каждой операции выделения памяти, организовав при доступе к ней проверку указателя. Последний должен быть связан с корректным тегом. Для чего потребовалось расширение? Оно дает возможность блокировать эксплуатацию уязвимостей, которые вызваны обращением к уже освобожденным блокам памяти, переполнениями буфера, обращениями до инициализации и использованием вне текущего контекста.
    • В эмуляторе для 68k разработчики добавили новый тип эмулируемых машин virt. Нововведение позволяет использовать для оптимизации производительности устройства virtio.
    • В архитектуре x86 появилась возможность применения технологии AMD SEV-ES (Secure Encrypted Virtualization) для шифрования регистров процессора, используемых в гостевой системе. В итоге содержимое регистров недоступно для хост-окружения в том случае, если гостевая система не предоставляет к ним явный доступ.
    • Для архитектуры MIPS также добавлен новый тип эмулируемых машин «virt» с поддержкой новых китайских процессоров Loongson-3.
    • Для PowerPC, точнее, для эмулируемых машин добавлена поддержка внешних BMC-контроллеров. Если случается сбой с pseries из-за попытки горячего извлечения памяти и CPU, то обеспечивается информирование о сбоях.
    • Появилась поддержка эмуляции процессоров Qualcomm Hexagon c DSP.
    • Реализована поддержка хост-окружений macOS на системах с новым ARM-чипом Apple M1 в классическом генераторе кода TCG (Tiny Code Generator).
    • При эмуляции архитектуры RISC-V для плат Microchip PolarFire реализована поддержка QSPI NOR flash.
    • В эмуляторе Tricore добавлена поддержка новой модели плат TriBoard, эмулирующей SoC Infineon TC27x.
    • В ACPI-эмуляторе теперь можно назначать имена сетевым адаптерам внутри гостевых систем, которые не зависят от порядка подключения к шине PCI

    С полным списком изменений и дополнений можно ознакомиться вот здесь.

    Selectel
    IT-инфраструктура для бизнеса

    Комментарии 6

      0
      Значит скоро и докер под apple m1 обновится с новым эмулятором
        0

        Лучше напишите, как они вот этого достигают — «Благодаря особенностям эмулятора приложение в изолированном окружении выполняется почти с той же эффективностью, что и в нативном окружении.»

          –1
          За счёт трансляции, а не эмуляции. Например аналогично работает WINE.

          Вместо того чтобы эмулировать железо ARM (что было бы крайне медленно, из-за отсутствия аппаратной поддержки), — они превращают arm-инструкции в аналогичные x86-инструкции (виртуализация которых поддерживается железом).

          Подход не новый. Тот же libhoudini в android-x86 появился лет 10 назад, который делал ровно тоже самое.
            +3
            Разве wine использует jit? Мне кажется вы путаете. Wine по факту это подмена системных вызовов и реализация поддержки запускаемых бинарников. Сам код запускается нативно без какой либо эмуляции. По этой причине к примеру невозможен запуск wine несовместимой архитектуры (x86_64 на x86 например)
              0
              По факту — ситуация аналогичная, системные вызовы приложения подменяются на аналоги из хоста.
              Ну, если мы не говорим про какой-нибудь hangover, например. Там ещё и трансляция x86 -> arm идёт.
                0

                Там даже немного не так: системные вызовы не подменяются, такого функционала к сожалению пока нет в Linux. Вместо этого у wine есть своя реализация множества библиотек Windows таких, как user32.dll, которые в свою очередь имеют функции. Обычно программы для Windows не используют системные вызовы напрямую, а работают через такие библиотеки.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое