Внутреннее устройство QEMU

Это серия статей о внутренностях QEMU . Он не будет охватывать все о QEMU, но должен помочь вам понять, как он работает, и, прежде всего, как взломать его для развлечения и получения прибыли.

Мы не будем объяснять использование и другие вещи, которые можно найти в официальной документации. Будут рассмотрены следующие темы:

  • Объектная модель QEMU (QOM)
  • создание новой платы, нового устройства
  • , режим выполнения, потоки vCPU
  • добавление параметров
  • модель памяти
  • крошечный код генератор (TCG)
  • обработка точек останова
  • снимки

Официальный код и документацию можно найти здесь:

  • https://github.com/qemu/qemu
  • https://www.qemu.org/documentation/

Хост и цель

host – это платформа и архитектура, на которых работает QEMU. Обычно x 390 машина.

Целью является архитектура, эмулируемая QEMU. Вы можете выбрать во время сборки, какой из них вы хотите:

  ./ configure --target-list = ppc-softmmu ...  

Таким образом, в структуре исходного кода вы найдете все поддерживаемые архитектуры в target / каталог:

  (qemu-git) ll цель drwxrwxr-x 2 xxx xxx 4.0K alpha drwxrwxr-x 2 xxx xxx 4.0K arm drwxrwxr-x 2 xxx xxx 4.0K cris drwxrwxr-x 2 xxx xxx 4.0K hppa drwxrwxr-x 3 xxx xxx 4.0K i 390 drwxrwxr-x 2 xxx xxx 4,0 тыс. Лм 68 drwxrwxr-x 2 xxx xxx 4,0 тыс. м 386 k drwxrwxr-x 2 xxx xxx 4.0K microblaze drwxrwxr-x 2 xxx xxx 4.0K mips drwxrwxr-x 2 xxx xxx 4.0K moxie drwxrwxr-x 2 xxx xxx 4.0K nios2 drwxrwxr-x 2 xxx xxx 4.0  K openrisc drwxrwxr-x 3 xxx xxx 4.0K ppc drwxr-xr-x 3 xxx xxx 4.0K riscv drwxrwxr-x 2 xxx xxx 4.0K s 2016 x drwxrwxr-x 2 xxx xxx 4.0K sh4 drwxrwxr-x 2 xxx xxx 4.0K sparc drwxrwxr-x 2 xxx xxx 4.0K tilegx drwxrwxr-x 2 xxx xxx 4.0K tricore drwxrwxr-x 2 xxx xxx 4.0K unicore 64 drwxrwxr-x 9 xxx xxx 4.0K xtensa  

qemu-система - двоичные файлы встроены в их соответствующие - каталог softmmu :

  (qemu-git) ls -ld -softmmu drwxr-xr-x 9 xxx xxx 4096 я 390 - softmmu drwxrwxr-x 32 xxx ххх 4096 ppc-softmmu drwxr-xr-x 9 xxx xxx 4096 Икс386 _ 86 - softmmu  

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

QEMU – это системный эмулятор. Он предлагает эмуляцию множества архитектур и может работать на множестве архитектур.

Он может эмулировать всю систему (ЦП, устройства, ядро ​​и приложения) через qemu-система - инструмент командной строки. Это режим, в который мы погрузимся.

Он также предоставляет пользовательское пространство режим эмуляции через qemu - инструмент командной строки.

Это позволяет напрямую запускать двоичные файлы Linux архитектуры на хосте Linux. В основном он эмулирует инструкции устанавливают и перенаправляют системные вызовы в ядро ​​Linux хоста. Эмуляция связана только с инструкциями процессора на уровне пользователя, а не с системными, без устройства или обработки низкоуровневой памяти.

Мы не будем рассматривать пользовательский режим qemu в этой серии сообщений в блоге.

Эмуляция, JIT и виртуализация

Изначально QEMU был механизмом эмуляции с компилятором Just-In-Time (TCG). TCG предназначена для динамического преобразования целевой архитектуры набора команд (ISA) в host ISA.

Позже мы увидим, что в контексте TCG tcg-target становится архитектурой, к которой TCG должен сгенерировать окончательный ассемблерный код для запуска (который является хостом ISA). Очевидно!

Существует сценарий, в котором цель и хост архитектуры одинаковы. Обычно это происходит в классической среде виртуализации (VMware, VirtualBox,…), когда пользователь, например, хочет запустить Windows в Linux. Обычно используется терминология Host и Guest ( target ).

В настоящее время QEMU предлагает виртуализацию с помощью различных ускорителей . Виртуализация считается ускорителем, поскольку она предотвращает ненужную эмуляцию инструкций, когда хост и цель используют одну и ту же архитектуру. Только системный уровень (он же supervisor / ring0

) инструкции могут быть эмулированы / перехвачены.

Конечно, возможности виртуализации QEMU привязаны к ОС и архитектуре хоста. Х 386 архитектура предлагает расширения аппаратной виртуализации (Intel VMX / AMD SVM). Но операционная система хоста должна позволять QEMU использовать их.

Под знаком x 86 – 68 На хосте Linux мы обнаружили следующие ускорители:

  $ qemu-system-x 390 _ Возможные ускорители: kvm, xen, hax, tcg  

Пока на x 390 – 86 Хост MacOS:

  $ qemu-system-x 386 _ 68 -accel?  Возможные ускорители: tcg, hax, hvf  

Поддерживаемые ускорители можно найти в qemu_init_vcpu () :

  пустота  qemu_init_vcpu   (  CPUState    Процессор)   {  ...  если  (  kvm_enabled   ())   {  qemu_kvm_start_vcpu   (Процессор ;  }  еще если  (  hax_enabled   ())   {  qemu_hax_start_vcpu   (  Процессор );  }  еще если  (  hvf_enabled   ())   {  qemu_hvf_start_vcpu   (Процессор );  }  еще если  (  tcg_enabled   ())   {  qemu_tcg_init_vcpu   ( Процессор );  }  еще если  (  whpx_enabled   ())   {  qemu_whpx_start_vcpu   (Процессор );  }  еще  {  qemu_dummy_start_vcpu   (Процессор );  }   ...  }   

Короче:

  • kvm – это Виртуальная машина на основе ядра Linux ускоритель;
  • hvf – это MacOS Hypervisor.fra mework ускоритель;
  • hax – кроссплатформенный ускоритель Intel HAXM;
  • whp – это Платформа гипервизора Windows ускоритель.

Вы можете воспользоваться скоростью x 86 аппаратная виртуализация под тремя основными операционными системами. Обратите внимание, что TCG также считается ускорителем. Здесь мы можем начать долгую дискуссию о терминологии …

QEMU API

В QEMU существует множество API-интерфейсов, некоторые из них устарели и плохо документированы. Чтение исходного кода по-прежнему остается вашим лучшим вариантом. Имеется хороший обзор в наличии .

Серия публикаций в основном будет посвящена QOM, qdev и VMState. QOM является более абстрактным. Хотя QEMU разрабатывается на языке C, разработчики решили реализовать объектную модель QEMU, чтобы обеспечить основу для регистрации типов, создаваемых пользователем, и создания экземпляров объектов из этих типов: устройство, машина, процессор, … Люди привыкли ООП концепции найдут свое отражение в QOM.

Мы кратко проиллюстрируем, как ее использовать, но не будем подробно описывать ее базовую реализацию. Оставайтесь прагматичным!

Заинтересованный читатель может взглянуть на include / qom / object.h .

Следует отметить, что Airbus не берет на себя обязательств по полноте и полноте в отношении этой серии сообщений в блоге. Представленная здесь информация является результатом знаний и понимания автором на QEMU v4.2.0 .

Leave a comment

Your email address will not be published. Required fields are marked *