仮想マシン モニター (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がユーザーモードのときにユーザープログラムが特権命令を実行するとどうなりますか?
- ユーザープログラムがシステムコールを実行するとどうなりますか?