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