2017-08-16 15 views
2

ゲストマシンのユーザープロセスでカスタムハイパーコールを呼び出し、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は引数の数です)。しかし、私はこれらの機能のコールサイトを見つけることができません。

ゲストカーネルを変更せずにハイパーコールを起動することはできますか?もしそうなら、それを行う方法?そうでない場合、代替手段はありますか?

答えて

1

ゲスト(VMX非ルートモード)では、VMCALLによって任意のCPLレベルでVMが終了します。 CPLのチェックは、VMXルートモードの場合にのみ実行されます。

無条件のVM終了を引き起こす別の方法は、CPUID命令によるものです。 VMMは、ハイパーコールと通常のCPUID呼び出しをEAXの値で区別することができます。

+0

ああ、私はドキュメントを誤読しました。それで 'asm(" vmcall "::" a "(VAL))'を実行すると、コントロールを受け取ることができますか?私は試してみましたが、 'qemu/kvm-all.c'の' 'kvm_cpu_exec() 'の' run-> exit_reason'は決して 'VAL'という値のsamsではありません。コードポイントのどこを調べるべきか分かりますか? –

+0

私はKVMの内部についてはわかりませんが、終了理由は18(vmcall)になると思います。ゲスト状態からeaxの値を取得します。 – prl

+0

私はその理由を見つけました! [このページ](https://github.com/dpw/kvm-hello-world)によれば、「VMCALL(またはVMMCALL on AMD)命令が最も明白な方法であり、具体的にはハイパーバイザーに呼び出すことを意図しています。しかし、これらの命令によって引き起こされたVM出口のユーザー空間VMホストプログラムに通知することなく、KVMがVMCALL/VMMCALLの内部ハイパーコールメカニズムを予約することが分かります。したがって、VM出口をトリガーするには別の方法が必要です。 HLTはシングルバイト命令であるため便利です。このため、qemuはVMの終了とその終了理由を受け取ることができません! :) –

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

ハイパーコールゲスト&ホストとの間でメッセージを転送するだけの方法、あなたは(のvirtioはhypercall2を使用のような)ハイパーコールをトリガーするかもしれないが、それはあなたのために有用ですか?

+0

私はmitakeをやった。私がしたいのは、ユーザープロセスが特定の命令(たとえば、vmcall)を実行するときに、ゲストのユーザープロセスからホストのqemuにコントロールを転送することです。カーネルのハイパーコールはユーザにとって使い勝手が悪いかもしれません。 –

+0

@ DaeR.Jeong最も良い方法は、仮想デバイスモデルを/ dev /に追加し、共有メモリを使うことです –

関連する問題