2016-11-26 1 views
0

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)

+0

Ist diese Frage so dumm oder die Antwort ist sehr einfach, dass niemand sie beantworten will? – wangt13

+0

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. –

+0

@Arnabjyoti, würde ich sehr geschätzt, wenn Sie Ihre Antworten teilen können. – wangt13

Antwort

0

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:

vl.c start of everything

Die Initialisierung der KVM-Architektur über die unten Funktion geschieht - (CPU Fahnen sammeln von CPUID und Einrichten Frequenzen usw.)

kvm_arch_init_vcpu

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: -

kvm_arch_put_registers

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.

+0

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

+0

@ Wangt13, ja, von der hohen Ebene, Sie haben Recht. Aber es gibt viel mehr Dinge, die in der Mitte passieren. –

Verwandte Themen