2017-04-24 4 views
1

仮想化を理解する一環として、私はKVMのサポートを拡張し、新しい命令を確定しようとしています。この命令は、以前に使用されていないオペコードを使用します。 ref-ref.x86asm.net/coder32.html。未使用のx86オペコードのlinux KVMで新しい命令を実装する方法

ここで、 'CPUID'(vm-exitを引き起こす)のような命令を考えてみましょう。例えば、 'NEWCPUID'という新しい命令を追加したいのですが、特権のCPUIDに似ていて、ハイパーバイザーではありますが、実装は異なります。

いくつかのオンラインリソースを調べた後、新しいシステムコールを定義する方法を理解できましたが、LinuxソースコードのすべてのファイルにNEWCPUIDのコードを追加する必要はありませんか? 'find'コマンドに頼るよりも良い方法はありますか?

私はチャレンジの下で直面しています: 1.コードを追加するには、Linuxのソースコードのどこにある必要がありますか? 2.この新しい命令を以前に使用されていなかったオペコードにどのようにマップできるかわかりませんか?

私はこの分野に全く触れておらず、これを学びたいと思っています。これを達成するには正しい方向が必要です。プロセスを説明しているリファレンス/チュートリアル/ブログがあれば、大きな助けになるでしょう!

+1

AFAIK、KVMは実際にエミュレーションを実行しません。あなたはどのように「新しい指示」を加えることを提案していますか?無効なオペコードを使用してCPU例外をトリガーしようとしていますか? – tangrs

答えて

0

はここにあなたの質問のいくつかに答えます:

  1. ...しかし、私は確認していないLinuxのソースコード内のどのすべてのファイルについて、私はNEWCPUIDのコードを追加する必要がありますか? A - KVMのエミュレーションを追加する正しい場所は、arch/x86/kvm/emulate.cです。 opcode_table []がどのように定義され、それらが実行する関数へのフックを見てみましょう。基本的な考え方は、ゲストが実行し、 "db 0xunused"などの未定義命令です。これは、命令が未定義であるため終了することになります。 KVMでは、VMCS/VMCBからリップルを見て、KVMが知っている命令(NEWCPUIDなど)か、KVMがx86_emulate_instruction()を呼び出すかを判断します。

  2. ...「find」コマンドに頼るよりも良い方法はありますか? A - はい、システムコールの例を選択し、cscopeなどのシンボルの相互参照を使用します。

  3. ... n短くこのタスクについてどうすればいいですか? A - 1で述べたように、ゲストはこの未使用のオペコード(dbトリックなど)を実行しようとする方法を見つけます。私は、アセンブラが未知のオペコードを拒絶しようとしていると思う。それで、その最初のステップ。次に、あなたの命令がvmexit()を引き起こすかどうかをチェックします。このために、トレースを使用することができます。トレースは多くの出力を生成するので、いくつかのフィルタオプションを使用する必要があります。トレースが圧倒的である場合は、単にvmx_handle_exit(vmx.c)に何かを印刷してください。最後に、ここからカスタム関数にフックする方法を見つけてください。 KVMはすでにゲストの例外を処理するhandle_exception()を持っています。カスタム関数を挿入するのに適しています。この関数がemulate_instructionを呼び出して、ゲストに注入される例外をエミュレートする方法を参照してください。

私は学習の過程で自分自身を把握するためにそれらが不可欠考えるので、私は意図的にいくつかの質問をスキップしています。ところで、私はこれが仮想化を理解する最善の方法ではないとは思わない。より良い方法は、/ dev/kvm経由でkvmサービスをutlizeする独自のユーザー空間ハイパーバイザを作成することです。単なるスタンドアロンのハイパーバイザです。

関連する問題