Ich bin neu sowohl auf SO und X86 VMX. Ich lerne KVM-QEMU auf X86, und ich möchte Details darüber wissen, wie die erste Anweisung der VM abgerufen wird, damit die VM starten kann. Es gibt KVM-APIs zum Konfigurieren und Registrieren eines Speichersatzes als physischen Speicher für die VM. Setzen Sie dann guest_RIP auf AAA (zum Beispiel). Ich weiß nicht, wann VMLaunch aufgerufen wird (mit richtig konfigurierten VMCS), wie kann die CPU den Befehl von diesem RIP in VMCS abrufen, ist dies durch einen Adressübersetzungsprozess, so dass der guest_CR3 richtig eingestellt sein muss, um auf den Host-Speicher für den Gast reserviert? DankeWie wird die erste Anweisung von VirtualMachine abgerufen (in KVM-QEMU)
Antwort
Ich werde dies im Zusammenhang mit QEMU erklären und wie QEMU funktioniert, wenn der KVM-Beschleuniger aktiviert ist.
Wie Sie vielleicht wissen, werden unter kvm virtuelle Maschinen erstellt, indem ein Geräteknoten /dev/kvm
geöffnet wird. Ein Gast hat seinen eigenen Speicher und ist normalerweise von dem Userspace-Prozess getrennt, der ihn erstellt hat. Im Grunde genommen ist kvm wie ein ziemlich typisches Linux-Zeichen-Gerät aufgebaut - Sie verwenden ioctl()
s zum Erstellen, Ausführen, Ändern von Parametern, Zuweisen von Speicher und Lesen und Schreiben in die VCPU-Register der virtuellen Maschinen. Daher wird die Ersteinrichtung über verschiedene ioctl()
s erfolgen, die KVM für die weitere Verwendung einrichten.
In Bezug auf die QEMU-Code, alle Ausführung (ob KVM oder nicht-KVM) beginnt ab:
Die Initialisierung der KVM-Architektur über die unten Funktion geschieht - (CPU Fahnen sammeln von CPUID und Einrichten Frequenzen usw.)
Sobald alle Initialisierungsfunktionen durchgeführt werden, die Die Funktion do_kvm_cpu_synchronize_post_init
versucht, die Anfangswerte der VCPU-Register basierend auf dem Host-CPU-Status zu synchronisieren. Er ruft eine andere Funktion kvm_arch_put_registers
auf und setzt die VCPU auf dirty. Warum ist die VCPU auf schmutzig eingestellt? Nur dann initialisieren die nachfolgenden Funktionen tatsächlich die Werte der VCPU-Register. Diese Funktion kvm_arch_put_registers
ist der Schlüssel zum Erhalten aller Anfangswerte der VMCS-Register. Wenn Sie seinen Körper zu sehen, werden Sie feststellen, was geschieht: -
Insbesondere im Hinblick auf die Funktionen konzentrieren, kvm_getput_regs
und kvm_put_sregs
- die erste Funktion werden die Anfangswerte der GPRs einzurichten und die EFLAGS sowie das EIP/RIP Register, während die zweite Funktion die anfänglichen Segmentregisterwerte aufstellt.
Die Gastpagetabelle wird mit dem CR3 Register verwurzelt sein. Wie funktioniert diese Seitentabelle?
Dazu benötigen Sie, dass die MMU in KVM zu erinnern, nur für eine Ebene der Virtualisierung Konten (virtueller Gast -> physischer Gast), aber für die zweite Ebene nicht (physischer Gast -> Host-physische) zu berücksichtigen. Der anfängliche RIP berücksichtigt virtuelle Adressen - er wird entsprechend in physische Adressen im Gast übersetzt. Um diese physische Gastadresse in die physische Adresse des Hosts zu konvertieren, benötigen Sie jedoch eine separate Seitentabelle. Dies ist eine Schattenseiten-Tabelle, die in Verbindung mit der Originalseitentabelle verwendet wird (die Gast virtual konvertiert -> physischer Gast), um die gesamte Übersetzung durchzuführen.
Es besteht ein Bedarf für den Zustand der Gastseitentabelle mit der Schattenseite-Tabelle zu synchronisieren und dies neigt manchmal dazu, ein Problem zu sein. Wenn der Gast in seine Seitentabelle schreibt, müssen die entsprechenden Änderungen auch an den Schattenseiten-Tabellen vorgenommen werden.
Vielen Dank für die ausführliche Antwort. Bitte korrigieren Sie mich, wenn mein Verständnis falsch ist. Um die VM zu starten (erste Anweisung, normalerweise im Real-Modus), muss KVM den VM-Speicher einrichten, den Boot-Code in den Speicher für die VM laden, dann EIP/RIP auf die Adresse der ersten Anweisung einstellen und vmlaunch at aufrufen zuletzt, um die VM zu starten. – wangt13
@ Wangt13, ja, von der hohen Ebene, Sie haben Recht. Aber es gibt viel mehr Dinge, die in der Mitte passieren. –
- 1. Wie wird die Spaltennummer in C++ abgerufen?
- 2. Wie Wert abgerufen und verwendet wird, wird in der return-Anweisung von window.onbeforeunload-Ereignis angezeigt
- 3. Wie die gesamte va_list-Eingabe abgerufen wird
- 4. Wie wird die Größe dieses Arrays abgerufen?
- 5. Wie wird die Versionsnummer automatisch abgerufen?
- 6. Verwenden einer Liste, die von einer SQLite-Abfrage in einer Foreach-Anweisung abgerufen wird
- 7. Wie wird die SCNNode-Position gespeichert/abgerufen?
- 8. JavaScript - Nur der erste Teil von if-Anweisung wird ausgewertet
- 9. Wie wird die Warteschlange von AWS SQS mit Laravel abgerufen?
- 10. Wie wird die Sammlung von Shopify SDK abgerufen?
- 11. Wie wird die Größe des Verbindungspools programmgesteuert in JBoss abgerufen?
- 12. Wie wird die geklickte ElementId in angularjs abgerufen?
- 13. Wie wird die Koordinate eines ClickableSpan in einem TextView abgerufen?
- 14. Wie wird ein Array in URL abgerufen?
- 15. Aufruf von super() muss die erste Anweisung im Konstruktor sein
- 16. Wie Wert abgerufen wird von ausgewählten Array in Javascript
- 17. Zugriff auf die VirtualMachine-Schnittstelle für Azure SDK Java
- 18. Wie wird die implementierende Klasse/Schnittstelle der Elternschnittstelle abgerufen?
- 19. Wie vermeide ich die Verwendung von Speicher oder Speicher löschen, wenn nur das erste Element aus einer ArrayCollection abgerufen wird?
- 20. Wie wird die URL des Images vom Firebase-Speicher abgerufen?
- 21. Geben Sie das erste oder Standardbild ein, das von der Google+ API über OpenGraph abgerufen wird
- 22. Wie wird die dynamische @Para-Anweisung erstellt?
- 23. Kein Standort wird jemals von FusedLocationProviderApi abgerufen
- 24. Wie überprüfe ich die enum-Eigenschaft, wenn die Eigenschaft von dynamic in C# abgerufen wird?
- 25. Wie schnell wird ein Azure-Konfigurationswert abgerufen?
- 26. Wie wird die ID der gehosteten AWS Route53-Zone abgerufen?
- 27. Aufruf von typeface.js in HTML, das von jQuery abgerufen wird?
- 28. python - sklearn 0.17 und 0.18 - wie wird nur der erste Wert eines StratifiedKFold-Objekts abgerufen?
- 29. Wie die statische Variable für jeden Funktionsaufruf abgerufen wird
- 30. Wie wird die UIImageView-Größe nach dem automatischen Layout abgerufen?
Ist diese Frage so dumm oder die Antwort ist sehr einfach, dass niemand sie beantworten will? – wangt13
Hi @ wangt13, suchen Sie noch eine Antwort auf diese Frage? Wenn ja, kann ich versuchen, es in Bezug auf QEMU zu erklären und wie QEMU mit KVM versucht, diese Aktivität zu machen. –
@Arnabjyoti, würde ich sehr geschätzt, wenn Sie Ihre Antworten teilen können. – wangt13