2017-08-16 3 views
2

Ich möchte einen Benutzerprozess in Gastmaschine einen benutzerdefinierten hypercall aufrufen und qemu empfängt es. Ich möchte keine Änderungen an einem Gastkernel vornehmen.
Von this answer und andere Materialien, weiß ich, dass vmcall Anweisung wird VMEXIT und VMM erhalten die seine Ausgang Grund und Argumente.Aufruf von Hypercall in qemu-kvm ohne Gast Kernelmodifikation

Nach Intel® 64 and IA-32 Architectures Software Developer’s Manual p.1201, vmcall Anweisung wird eine Ausnahme auslösen, wenn CPL> 0
So schließe ich, dass ich ein (Gast) Kernel-Schnittstelle benötigen einen Hypercall aufzurufen.

Ich fand, dass im Linux-Kernel kvm_hypercallx Funktionen hat (wobei x eine Anzahl von Argumenten ist). Aber ich kann eine Aufrufseite dieser Funktionen nicht finden.

Ist es möglich, einen Hypercall ohne Änderung eines Gastkernels aufzurufen? Wenn ja, wie? Wenn nicht, gibt es eine Alternative?

Antwort

1

VMCALL bewirkt einen VM-Exit auf jeder CPL-Ebene in einem Gast (VMX ohne Root-Modus). Die Überprüfung auf CPL erfolgt nur, wenn sie sich im VMX-Stammmodus befindet.

Eine andere Möglichkeit, einen bedingungslosen VM-Exit zu verursachen, ist die CPUID-Anweisung. Der VMM kann einen Hyperaufruf von einem regulären CPUID-Aufruf durch den Wert in EAX unterscheiden.

+0

Ah ich habe das Dokument falsch gelesen. Dann, wenn ich 'asm (" vmcall "::" a "(VAL))' ausführen, kann qemu das Steuerelement erhalten? Ich habe es versucht, aber 'run-> exit_reason' in 'kvm_cpu_exec() in qemu/kvm-all.c' ist nie die Sams als der Wert' VAL'. Weißt du, wo der Code Point sollte ich schauen? –

+0

Ich kenne keine KVM-Interna, aber ich denke, der Ausgangsgrund wäre 18 (vmcall). Sie würden den Wert von eax vom Gaststaat erhalten. – prl

+0

Ich habe den Grund gefunden! [Diese Seite] (https://github.com/dpw/kvm-hello-world) sagt, dass "die naheliegendste Art und Weise die VMCALL (oder VMMCALL on AMD) Anweisung ist, die speziell dazu bestimmt war, den Hypervisor aufzurufen . Es stellt sich jedoch heraus, dass der KVM VMCALL/VMMCALL für seinen internen Hypercall-Mechanismus reserviert, ohne das Userspace-VM-Host-Programm der VM-Exits, die durch diese Anweisungen verursacht werden, zu benachrichtigen. Wir brauchen also einen anderen Weg, um einen VM-Exit auszulösen. HLT ist praktisch, weil es ein Einzelbyte-Befehl ist. Deshalb kann qemu den vm-Ausgang und seinen Ausgangsgrund nicht empfangen! :) –

0
Is it possible to invoke a hypercall without any modification of a guest kernel? 

Hypercall nur eine Möglichkeit Nachricht zwischen Gast & Host zu übertragen, können Sie die Hypercall auslösen (wie virtio hypercall2 verwendet wird), aber es ist für Sie geeignet?

+0

Ich habe einen Mitakt gemacht. Ich möchte ein Steuerelement vom Benutzerprozess eines Gastes auf das qemu eines Hosts übertragen, wenn der Benutzerprozess die spezifische Anweisung ausführt (z. B. vmcall). Hypercall im Kernel ist möglicherweise nicht benutzerfreundlich. –

+0

@ DaeR.Jeong Der beste Weg sollte ein virtuelles Gerätemodell in/dev/hinzufügen und Shared Memory verwenden –

Verwandte Themen