Qemu :
QEmu - це власне повноцінне програмне забезпечення. Ви використовуєте його для емуляції машин, він дуже гнучкий і портативний. В основному він працює за допомогою спеціального 'рекомпілятора', який перетворює двійковий код, записаний для даного процесора, в інший (скажімо, для запуску MIPS-коду на ПК-мак або ARM на комп'ютері x86).
Щоб наслідувати більше, ніж просто процесор, Qemu включає довгий список периферійних емуляторів: диск, мережа, VGA, PCI, USB, послідовний / паралельний порт тощо.
KQemu :
У конкретному випадку, коли і джерело, і ціль є однаковою архітектурою (як звичайний випадок x86 на x86), він все ще повинен проаналізувати код, щоб видалити будь-які "привілейовані інструкції" та замінити їх контекстними комутаторами. Щоб зробити його максимально ефективним на x86 Linux, є модуль ядра під назвою KQemu, який обробляє це.
Будучи модулем ядра, KQemu здатний виконувати більшість кодів без змін, замінюючи лише інструкції, призначені лише для ring0. У цьому випадку користувальницький простір Qemu все ще виділяє всю оперативну пам’ять для емульованої машини та завантажує код. Різниця полягає в тому, що замість перекомпіляції коду він викликає KQemu для сканування / виправлення / виконання. Вся периферійна апаратна емуляція виконується в Qemu.
Це набагато швидше, ніж звичайний Qemu, оскільки більша частина коду не змінюється, але все ж має трансформувати код ring0 (більша частина коду в ядрі VM), тому продуктивність все ще страждає.
КВМ :
KVM - це декілька речей: спочатку це модуль ядра Linux (тепер він включений в основну лінію), який перетворює процесор у новий стан гостя. Стан гостя має власний набір станів дзвінка, але привілейовані інструкції ring0 повертаються до коду гіпервізора. Оскільки це новий спосіб виконання процесора, код не має бути жодним чином змінювати.
Крім переключення стану процесора, модуль ядра також обробляє декілька низькорівневих частин емуляції, таких як регістри MMU (використовувані для обробки VM) та деякі частини емульованого обладнання PCI.
По-друге, KVM - це вилка виконуваного файлу Qemu. Обидві команди активно працюють над тим, щоб мінімізувати відмінності, і є досягнення в її зменшенні. Зрештою, мета полягає в тому, що Qemu повинен працювати де завгодно, і якщо модуль ядра KVM доступний, він може бути використаний автоматично. Але в осяжному майбутньому команда Qemu зосереджується на апаратній емуляції та портативності, тоді як KVM фокусується на модулі ядра (іноді переміщуючи туди невеликі частини емуляції, якщо це покращує продуктивність) та взаємодіє з рештою коду простору користувача.
Виконаний файл kvm-qemu працює як звичайний Qemu: виділяє оперативну пам'ять, завантажує код і замість того, щоб перекомпілювати його або викликати KQemu, він породжує потік (це важливо). Потік викликає модуль ядра KVM для переходу в гостьовий режим і переходить до виконання коду VM. У привілейованій інструкції він перемикається назад на модуль ядра KVM, який, якщо необхідно, передає потік Qemu для обробки більшості апаратної емуляції.
Однією з приємних речей цієї архітектури є те, що гостьовий код емулюється в потоковій позі, якою можна керувати за допомогою звичайних інструментів Linux. Якщо ви хочете VM з 2 або 4 ядрами, kvm-qemu створює 2 або 4 потоки, кожен з них викликає модуль ядра KVM для початку виконання. Паралельність - якщо у вас достатньо реальних ядер - або планування - якщо ні - керується звичайним планувальником Linux, зберігаючи код невеликим, а сюрпризи обмежені.