Qemu :
QEmu to kompletne i samodzielne oprogramowanie. Używasz go do emulacji maszyn, jest bardzo elastyczny i przenośny. Działa głównie przez specjalny „rekompilator”, który przekształca kod binarny napisany dla danego procesora na inny (powiedzmy, aby uruchomić kod MIPS na komputerze PPC mac lub ARM na komputerze z procesorem x86).
Aby emulować więcej niż tylko procesor, Qemu zawiera długą listę emulatorów peryferyjnych: dysk, sieć, VGA, PCI, USB, porty szeregowe / równoległe itp.
KQemu :
W konkretnym przypadku, w którym zarówno źródło, jak i cel mają tę samą architekturę (jak zwykły przypadek x86 na x86), nadal musi przeanalizować kod, aby usunąć wszelkie „uprzywilejowane instrukcje” i zastąpić je przełącznikami kontekstu. Aby uczynić go maksymalnie wydajnym w systemie Linux x86, istnieje moduł jądra o nazwie KQemu, który to obsługuje.
Będąc modułem jądra, KQemu jest w stanie wykonać większość kodu w niezmienionej formie, zastępując tylko instrukcje tylko dla najniższego poziomu pierścienia. W takim przypadku przestrzeń użytkownika Qemu nadal przydziela całą pamięć RAM dla emulowanej maszyny i ładuje kod. Różnica polega na tym, że zamiast ponownej kompilacji kodu wywołuje KQemu, aby go przeskanować / załatać / wykonać. Cała emulacja urządzeń peryferyjnych odbywa się w Qemu.
Jest to o wiele szybsze niż zwykłe Qemu, ponieważ większość kodu pozostaje niezmieniona, ale nadal musi przekształcić kod ring0 (większość kodu w jądrze maszyny wirtualnej), więc wydajność nadal spada.
KVM :
KVM to kilka rzeczy: po pierwsze jest to moduł jądra Linuksa - teraz zawarty w linii głównej - który przełącza procesor w nowy stan „gościa”. Stan gościa ma własny zestaw stanów dzwonienia, ale uprzywilejowane instrukcje ring0 wracają do kodu hiperwizora. Ponieważ jest to nowy tryb wykonywania procesora, kodu nie trzeba w żaden sposób modyfikować.
Oprócz przełączania stanu procesora moduł jądra obsługuje również kilka niskopoziomowych części emulacji, takich jak rejestry MMU (używane do obsługi VM) i niektóre części emulowanego sprzętu PCI.
Po drugie, KVM jest rozwidleniem pliku wykonywalnego Qemu. Oba zespoły aktywnie pracują nad utrzymaniem różnic na minimalnym poziomie, a postęp w ich zmniejszaniu. Ostatecznie celem jest to, aby Qemu działał w dowolnym miejscu, a jeśli moduł jądra KVM jest dostępny, można go użyć automatycznie. Ale w dającej się przewidzieć przyszłości zespół Qemu koncentruje się na emulacji sprzętu i przenośności, podczas gdy ludzie KVM skupiają się na module jądra (czasami przenosząc tam małe części emulacji, jeśli poprawia to wydajność) i łączą się z resztą kodu przestrzeni użytkownika.
Plik wykonywalny kvm-qemu działa jak normalny Qemu: przydziela pamięć RAM, ładuje kod i zamiast go ponownie skompilować lub wywołać KQemu, spawnuje wątek (jest to ważne). Wątek wywołuje moduł jądra KVM w celu przejścia do trybu gościa i kontynuuje wykonywanie kodu VM. Zgodnie z uprzywilejowaną instrukcją przełącza się z powrotem na moduł jądra KVM, który w razie potrzeby sygnalizuje wątkowi Qemu, aby obsłużył większość emulacji sprzętowej.
Jedną z fajnych cech tej architektury jest to, że kod gościa jest emulowany w wątku posix, którym można zarządzać za pomocą zwykłych narzędzi systemu Linux. Jeśli chcesz maszyny wirtualnej z 2 lub 4 rdzeniami, kvm-qemu tworzy 2 lub 4 wątki, z których każdy wywołuje moduł jądra KVM, aby rozpocząć wykonywanie. Współbieżność - jeśli masz wystarczającą liczbę rdzeni - lub planowanie - jeśli nie - zarządzane jest przez zwykły program do planowania Linuksa, utrzymując niewielki kod i niespodzianki ograniczone.
Podczas współpracy KVM arbitrażuje dostęp do procesora i pamięci, a QEMU emuluje zasoby sprzętowe (dysk twardy, wideo, USB itp.). Podczas pracy w pojedynkę QEMU emuluje zarówno procesor, jak i sprzęt.
źródło
QEMU działa wolniej, a KVM pomaga QEMU w osiągnięciu bardzo szybkiej szybkości sprzętowej w celu zapewnienia najlepszej wydajności systemu. QEMU to hypervisor / Emulator.
źródło