Я читал о KVM
и Qemu
на некоторое время. На данный момент у меня есть четкое представление о том, что они делают.
KVM поддерживает аппаратную виртуализацию, чтобы обеспечить производительность гостевых операционных систем, близкую к исходной. С другой стороны, QEmu эмулирует целевую операционную систему.
Что меня смущает, так это то, на каком уровне эти двое согласовываются. подобно
Кему:
QEmu - это полное и самостоятельное программное обеспечение. Вы используете его для эмуляции машин, он очень гибкий и портативный. В основном он работает с помощью специального «рекомпилятора», который преобразует двоичный код, написанный для одного процессора, в другой (скажем, для запуска кода MIPS на Mac PPC или ARM на ПК x86).
Чтобы эмулировать не только процессор, Qemu включает длинный список эмуляторов периферийных устройств: дисковые, сетевые, VGA, PCI, USB, последовательные / параллельные порты и т. Д.
KQemu:
В конкретном случае, когда и исходная, и целевая архитектура имеют одинаковую архитектуру (например, общий случай x86 на x86), ему все равно необходимо проанализировать код, чтобы удалить любые «привилегированные инструкции» и заменить их переключателями контекста. Чтобы сделать его максимально эффективным в x86 Linux, есть модуль ядра под названием KQemu, который этим занимается.
Будучи модулем ядра, KQemu может выполнять большую часть кода без изменений, заменяя только инструкции нижнего уровня только для ring0. В этом случае пользовательское пространство Qemu по-прежнему выделяет всю оперативную память для эмулируемой машины и загружает код. Разница в том, что вместо перекомпиляции кода он вызывает KQemu для его сканирования / исправления / выполнения. Эмуляция всего периферийного оборудования выполняется в Qemu.
Это намного быстрее, чем обычный Qemu, потому что большая часть кода не изменилась, но все же нужно преобразовать код ring0 (большая часть кода в ядре виртуальной машины), поэтому производительность все равно страдает.
KVM:
KVM - это две вещи: во-первых, это модуль ядра Linux, который теперь включен в основную линию, который переключает процессор в новое «гостевое» состояние. Гостевое состояние имеет свой собственный набор состояний кольца, но привилегированные инструкции ring0 возвращаются к коду гипервизора. Поскольку это новый режим работы процессора, код не нужно каким-либо образом изменять.
Помимо переключения состояния процессора, модуль ядра также обрабатывает несколько низкоуровневых частей эмуляции, таких как регистры MMU (используемые для обработки виртуальной машины) и некоторые части оборудования, эмулируемого PCI.
Во-вторых, KVM - это ответвление исполняемого файла Qemu. Обе команды активно работают над сведением различий к минимуму, и есть успехи в их сокращении. В конечном итоге цель состоит в том, чтобы Qemu работал где угодно, и если модуль ядра KVM доступен, его можно было бы использовать автоматически. Но в обозримом будущем команда Qemu фокусируется на аппаратной эмуляции и переносимости, в то время как специалисты по KVM сосредотачиваются на модуле ядра (иногда перемещая туда небольшие части эмуляции, если это улучшает производительность), и взаимодействуют с остальной частью кода пользовательского пространства.
Исполняемый файл kvm-qemu работает как обычный Qemu: выделяет ОЗУ, загружает код и вместо его перекомпиляции или вызова KQemu порождает поток (это важно). Поток вызывает модуль ядра KVM для переключения в гостевой режим и приступает к выполнению кода виртуальной машины. По привилегированной инструкции он переключается обратно на модуль ядра KVM, который при необходимости сигнализирует потоку Qemu о необходимости обработки большей части аппаратной эмуляции.
Одна из приятных особенностей этой архитектуры заключается в том, что гостевой код эмулируется в потоке posix, которым вы можете управлять с помощью обычных инструментов Linux. Если вам нужна виртуальная машина с 2 или 4 ядрами, kvm-qemu создает 2 или 4 потока, каждый из которых вызывает модуль ядра KVM для запуска. Параллелизм - если у вас достаточно реальных ядер - или планирование - в противном случае - управляется обычным планировщиком Linux, сохраняя небольшой размер кода и ограничивая неожиданности.
При совместной работе KVM регулирует доступ к процессору и памяти, а QEMU эмулирует аппаратные ресурсы (жесткий диск, видео, USB и т. Д.). При работе в одиночку QEMU эмулирует как процессор, так и оборудование.