システムコール中にWindowsはどのようにスーパーバイザーモードに切り替わりますか?「トラップ0」について何か聞いたのですが、それはx86命令のようにも思えません。いくつかのシステムコールを実行しましたが、見つかりません。多くのWindowsシステムコールはユーザーモードで実行されますか?スーパーバイザーモードで実行するのはどれですか?
2 に答える
x86 CPUは、SYSENTER
およびSYSEXIT
命令を提供します。これらの命令は、ユーザーモードからカーネルモードへの非常に高速な切り替えを実行し、最新のCPUで実行されている最新のOSは、非常にコストのかかる割り込みや遠方の呼び出しの代わりにこれらを使用する可能性があります。
詳細については、Intelのソフトウェア開発者向けマニュアル(特にボリューム2B )を参照してください。
システムコールは、ソフトウェア割り込みとも呼ばれます。ソフトウェア割り込みを呼び出すx86命令には、ニーモニックINTがあります。データがオペレーティングシステムに渡される方法は、オペレーティングシステムABIによって定義されます。私の知る限り、Windowsはすべてのルーチンに即時0x80を使用し、レジスターを介して追加のデータを送信しますが、よくわかりません。0x20は、0から31の範囲が予約されており、ゼロによる整数除算やメモリ障害などの一般的な例外に使用されるため、最初に使用可能な即時です。
基本的には、CPUが特権モードに変わり、IDTR(Interupt Descriptor Table Register)を読み取ります。そこで、IDT(Interupt Descriptor Table)の物理メモリアドレスを見つけ、ソフトウェア割り込み命令に組み込まれた8ビットに基づいてIDTを検索します。IDTは、メモリ内のどこにでも保存できます。IDTRは、LIDTおよびSIDTの命令によって読み取り/書き込みできます。IDTはさまざまな情報を格納できますが、割り込みの場合は、INTイミディエートに関連付けられたサービスルーチンにアドレスを格納します。
win32の例-ソフトウェア割り込みを発生させる関数..うーん。Printfとその仲間たちは、EnterCriticalSectionと同様に、確かにそうです。WindowsVistaおよびWindows7では、新しいコンポジットマネージャーにより、一部のOpenGLおよびDirectXAPI呼び出しでカーネルランドへのラウンドトリップが必要になりました。OpenGLの場合、これは、glReadPixels、glCopy(Sub)TexImage2Dなど、現在のバックバッファーを読み取るすべての関数に適用されます。
PS:この投稿を少し塩で取ってください。このようにWindowsをいじってからしばらく経ちましたが、ファクトチェックはあまり行いませんでした。編集やコメントは大歓迎です。
そして、ここに元のIntel 386マニュアルへのリンクがあります(とにかく引用しました)