it-swarm.com.de

Unterschied zwischen KVM und QEMU

Ich habe seit einiger Zeit über KVM und Qemu gelesen. Ab sofort habe ich ein klares Verständnis dafür, was sie tun.

KVM unterstützt die Hardwarevirtualisierung, um den Gastbetriebssystemen nahezu native Leistung zu bieten. Andererseits emuliert QEmu das Zielbetriebssystem.

Was mich verwirrt, ist, auf welcher Ebene diese beiden koordinieren. Mögen

  1. Wer verwaltet die Freigabe von RAM und/oder Speicher?
  2. Wer plant E/A-Vorgänge?
148
Abhishek Gupta

Qemu :

QEmu ist eine vollständige und eigenständige Software. Sie verwenden es, um Maschinen zu emulieren. Es ist sehr flexibel und portabel. Hauptsächlich funktioniert es mit einem speziellen 'Recompiler', der den für einen bestimmten Prozessor geschriebenen Binärcode in einen anderen umwandelt (z. B. um MIPS-Code auf einem PPC Mac oder ARM in einem x86 auszuführen PC).

Um mehr als nur den Prozessor zu emulieren, enthält Qemu eine lange Liste von Peripherie-Emulatoren: Festplatte, Netzwerk, VGA, PCI, USB, serielle/parallele Ports usw.

KQemu :

In dem speziellen Fall, in dem sowohl Quelle als auch Ziel dieselbe Architektur haben (wie im allgemeinen Fall von x86 unter x86), muss der Code weiterhin analysiert werden, um alle "privilegierten Anweisungen" zu entfernen und durch Kontextwechsel zu ersetzen. Um es unter x86 Linux so effizient wie möglich zu gestalten, gibt es ein Kernelmodul namens KQemu, das dies erledigt.

Als Kernelmodul kann KQemu den größten Teil des Codes unverändert ausführen und ersetzt nur die ring0-only-Anweisungen der niedrigsten Ebene. In diesem Fall weist der Benutzerbereich Qemu weiterhin alle RAM für den emulierten Computer zu und lädt den Code. Der Unterschied besteht darin, dass KQemu nicht neu kompiliert, sondern aufgerufen wird, um ihn zu scannen, zu patchen oder auszuführen. Die gesamte Emulation der peripheren Hardware erfolgt in Qemu.

Dies ist viel schneller als einfaches Qemu, da der meiste Code unverändert bleibt, aber immer noch ring0-Code transformieren muss (der größte Teil des Codes im Kernel der VM), sodass die Leistung immer noch leidet.

[~ # ~] kvm [~ # ~] :

KVM ist ein paar Dinge: Erstens ist es ein Linux-Kernelmodul, das jetzt in der Hauptzeile enthalten ist und den Prozessor in einen neuen Gaststatus versetzt. Der Gaststatus verfügt über einen eigenen Satz von Ringstatus, aber privilegierte ring0-Anweisungen greifen auf den Hypervisor-Code zurück. Da es sich um einen neuen Prozessorausführungsmodus handelt, muss der Code in keiner Weise geändert werden.

Abgesehen von der Prozessorzustandsumschaltung verarbeitet das Kernelmodul auch einige Teile der Emulation auf niedriger Ebene, wie die Register MMU (zur Verarbeitung von VMs) und einige Teile der emulierten PCI-Hardware.

Zweitens ist KVM eine Abzweigung der ausführbaren Qemu-Datei. Beide Teams arbeiten aktiv daran, Unterschiede auf ein Minimum zu beschränken, und es gibt Fortschritte bei der Reduzierung. Schließlich ist das Ziel, dass Qemu überall funktionieren sollte, und wenn ein KVM Kernelmodul verfügbar ist, könnte es automatisch verwendet werden. Auf absehbare Zeit konzentriert sich das Qemu-Team jedoch auf Hardware-Emulation und Portabilität, während sich KVM Leute auf das Kernel-Modul konzentrieren (manchmal werden kleine Teile der Emulation dorthin verschoben, wenn es die Leistung verbessert) und auf die Schnittstelle zum Rest des Userspace-Codes.

Die ausführbare Datei kvm-qemu funktioniert wie normales Qemu: Ordnet RAM zu, lädt den Code und erzeugt einen Thread, anstatt ihn neu zu kompilieren oder KQemu aufzurufen (dies ist wichtig). Der Thread ruft das Kernelmodul KVM auf, um in den Gastmodus zu wechseln, und fährt mit der Ausführung des Codes VM fort. Bei einer privilegierten Anweisung wird zurück zum Kernelmodul KVM gewechselt, das dem Qemu-Thread bei Bedarf signalisiert, den größten Teil der Hardwareemulation zu verarbeiten.

Eines der schönen Dinge dieser Architektur ist, dass der Gastcode in einem Posix-Thread emuliert wird, den Sie mit normalen Linux-Tools verwalten können. Wenn Sie ein VM mit 2 oder 4 Kernen möchten, erstellt kvm-qemu 2 oder 4 Threads, von denen jeder das Kernelmodul KVM aufruft, um mit der Ausführung zu beginnen. Die Parallelität - wenn Sie über genügend echte Kerne verfügen - oder die Planung - falls nicht - wird vom normalen Linux-Scheduler verwaltet, wodurch der Code klein und die Überraschungen begrenzt bleiben.

205
Javier

Bei der Zusammenarbeit entscheidet KVM] über den Zugriff auf die CPU und den Speicher, und QEMU emuliert die Hardwareressourcen (Festplatte, Video, USB usw.). Bei alleiniger Arbeit emuliert QEMU sowohl die CPU als auch die Hardware .

112