1

最近、私は仮想化について宿題をしています。私の質問は、VMMがどのように制御をゲストカーネルに転送し、そのコードをリング1で実行するかということです。

タイプ1VMM:これは従来のトラップアンドエミュレートVMMです。VMMはハードウェア上で直接実行され、リング0では「ホストオペレーティングシステム」として機能します。ゲストカーネルとゲストアプリケーションは、それぞれリング1とリング3でVMM上で実行されます。

  1. ゲストアプリケーションがシステムコールを行うと、リング0 VMMにトラップされます(CPUはこれを行うように設計されています)。

  2. 次に、VMMはこれがシステムコールであることを検出し、制御をゲストカーネルのsyscalハンドラーに転送して、リング1で実行します。

  3. 完了すると、ゲストカーネルはsyscall-returnを実行します。これは特権呼び出しであり、VMMに再びトラップされます。

  4. 次に、VMMはリング3のゲストユーザースペースに実際に戻ります(CPUもこれを行うように設計されています)。

私の質問はステップ2についてです。VMMはどのように制御をゲストカーネルに転送し、CPUを強制的に1回鳴らしますか?それ以降、ゲストカーネルコードはリング0で実行されるため、単純な「呼び出し」にすることはできません。これは、ある種の「syscall-return」または特別なコンテキストスイッチ命令である必要があります。

何か考えがありますか?ありがとうございました!

4

2 に答える 2

1

RPL=1 の CS セレクターを使用してゲスト OS を実行するだけです (ただし、x86 では)。特権の高いリングから下位のリングに戻るには、一般に ir​​et を使用します。

于 2013-10-01T16:48:32.170 に答える
0

Xen は、リング 1 でゲスト OS を実行する VMM の 1 つです。Xen では、HLT 命令 (ゲスト OS が実行されるリング 1 の命令) などの命令はハイパーコールに置き換えられます。この場合、HLT 命令を呼び出す代わりに、最終的に Linux カーネルで行われるように、xen_idle() メソッドが呼び出されます。代わりにハイパーコール、つまり特権リングの切り替えを管理する HYPERVISOR_sched_op(SCHEDOP_block, 0) ハイパーコールを実行します。詳細については、次を参照してください。

http://www.linuxjournal.com/article/8909

于 2012-10-29T16:24:45.143 に答える