13

仮想マシン モニター (VMM) が CPU を仮想化する方法を理解しようとしています。

現在の私の理解では、CPU がユーザー モードのときに特権命令が実行されようとすると、CPU は保護違反割り込みを発行します。C のような高級言語では、特権命令はシステム コール内にラップされます。たとえば、アプリケーションが現在の日付と時刻を必要とする場合 (I/O デバイスとやり取りする命令には特権が与えられます)、アプリケーションは特定のライブラリ関数を呼び出します。このライブラリ関数のアセンブル バージョンには、CPU でトラップを発生させる「int」と呼ばれる命令が含まれています。CPU はユーザー モードから特権モードに切り替わり、OS が提供するトラップ ハンドラにジャンプします。各システム コールには、独自のトラップ ハンドラがあります。この例では、トラップ ハンドラーがハードウェア クロックから日付と時刻を読み取って戻り、CPU 自体が特権モードからユーザー モードに切り替わります。(ソース:http://elvis.rowan.edu/~hartley/Courses/OperatingSystems/Handouts/030Syscalls.html )

ただし、この理解が正しいかどうかはよくわかりません。この記事では、(特権付きの) x86 popf 命令ではトラップが発生しないため、VMM の処理が複雑になるという概念について言及しています: http://www.csd.uwo.ca/courses/CS843a/papers/intro-vm.pdf . 私の理解では、 popf 命令は、システムコールではなくユーザープログラムによって明示的に呼び出された場合、トラップではなく保護違反割り込みを引き起こすはずです。

したがって、私の2つの具体的な質問は次のとおりです。

  • CPUがユーザーモードのときにユーザープログラムが特権命令を実行するとどうなりますか?
  • ユーザープログラムがシステムコールを実行するとどうなりますか?
4

2 に答える 2

24

順不同:

混乱の主な原因は、オペレーティング システム コミュニティに標準化された語彙がないことです。以下は、例外障害割り込みシステムコール、およびトラップという、同じことを意味する場合とそうでない場合があります。個々の著者は通常、これらの用語を一貫して使用しますが、著者が異なれば用語の定義も異なります。

特権モードに入る原因となる 3 種類のイベントがあります。

  1. 非同期割り込み (たとえば、サービスを必要とする i/o デバイスによって引き起こされます)。
  2. システム コール命令 ( intx86 の場合)。(より一般的には、x86 のマニュアルでは、これらはトラップと呼ばれ、他のいくつかの命令が含まれています (主にデバッガー向け))。
  3. 何か例外的なことを行う命令 (不正な命令、保護違反、0 による除算、ページ フォールトなど)。(さまざまな作成者が、これらを例外障害、またはトラップと呼んでいます。x86 のマニュアルでは、これらを障害と呼んでいます。)

各割り込み、トラップ、またはフォルトには、異なる番号が関連付けられています。

すべての場合:

  1. プロセッサが特権モードに入ります。
  2. ユーザーモードレジスタはどこかに保存されます。
  3. プロセッサは、割り込みベクタ テーブルのベース アドレスを見つけ、テーブルへのオフセットとして割り込み/トラップ/障害番号を使用します。これにより、その割り込み/トラップ/障害のサービス ルーチンへのポインターが提供されます。
  4. プロセッサはサービス ルーチンにジャンプします。これでプロテクト モードになり、ユーザー レベルの状態はすべて取得できる場所に保存され、オペレーティング システム内の正しいコードになります。
  5. サービス ルーチンが終了すると、割り込み復帰命令 (x86 では) が呼び出されます ( x86iretでは、これが障害とトラップの微妙な違いです。トラップ。)

「割り込みベクタテーブル」という紛らわしい名前に注意してください。割り込みテーブルと呼ばれていますが、フォールトやトラップにも使用されます。(これにより、一部の作成者はすべてを割り込みと呼ぶようになります。)

問題はpopfかなり微妙です。これは基本的に x86 アーキテクチャのバグです。popfユーザーモードから実行すると、トラップやフォールト(または例外や割り込みなど、呼び出したいものは何でも)は発生しません。単にヌープとして機能します

これは問題ですか?まあ、通常の OS では問題ありません。一方、仮想マシン モニター (VMWare、Xen、Hyper-V など) を実装している場合、VMM は保護モードで実行されており、ゲスト オペレーティング システムをユーザー モードで実行し、効率的にエミュレートしたいと考えています。任意の保護モード コード。ゲスト OS がpopf命令を使用する場合、一般保護違反を生成する必要がありますが、そうではありません。(cliおよびsti命令は、ユーザー モードから呼び出された場合、一般保護違反を生成します。これは、必要なことです。)

于 2013-06-13T19:01:04.310 に答える