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?
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? –
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
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! :) –