ゲストマシンのユーザープロセスでカスタムハイパーコールを呼び出し、qemuがそれを受け取るようにします。私はゲストカーネルを変更したくありません。
this answerおよびその他の資料から、vmcall
命令はVMEXITを引き起こし、VMMはその終了の理由と引数を受け取ることを知っています。ときCPL> 0
qemu-kvmでゲストカーネルを変更せずにhypercallを呼び出す
Intel® 64 and IA-32 Architectures Software Developer’s Manual p.1201によると、vmcall
命令が例外をトリガするだから、私はハイパーコールを呼び出す(ゲスト)カーネルインターフェースが必要と結論付けています。
Linuxカーネルのarch/x86/include/asm/kvm_para.h
には、kvm_hypercallx
の関数があります(xは引数の数です)。しかし、私はこれらの機能のコールサイトを見つけることができません。
ゲストカーネルを変更せずにハイパーコールを起動することはできますか?もしそうなら、それを行う方法?そうでない場合、代替手段はありますか?
ああ、私はドキュメントを誤読しました。それで 'asm(" vmcall "::" a "(VAL))'を実行すると、コントロールを受け取ることができますか?私は試してみましたが、 'qemu/kvm-all.c'の' 'kvm_cpu_exec() 'の' run-> exit_reason'は決して 'VAL'という値のsamsではありません。コードポイントのどこを調べるべきか分かりますか? –
私はKVMの内部についてはわかりませんが、終了理由は18(vmcall)になると思います。ゲスト状態からeaxの値を取得します。 – prl
私はその理由を見つけました! [このページ](https://github.com/dpw/kvm-hello-world)によれば、「VMCALL(またはVMMCALL on AMD)命令が最も明白な方法であり、具体的にはハイパーバイザーに呼び出すことを意図しています。しかし、これらの命令によって引き起こされたVM出口のユーザー空間VMホストプログラムに通知することなく、KVMがVMCALL/VMMCALLの内部ハイパーコールメカニズムを予約することが分かります。したがって、VM出口をトリガーするには別の方法が必要です。 HLTはシングルバイト命令であるため便利です。このため、qemuはVMの終了とその終了理由を受け取ることができません! :) –