質問しているOSを示していません。とにかく答えを試みさせてください。
CPU 命令syscall
とシステム コールの概念およびそれぞれの OS でのその表現とsysenter
混同しないでください。
インテル® 64 および IA-32 アーキテクチャー・デベロッパーズ・マニュアルのボリューム2A (については、 3-392ページを参照) およびボリューム 2B ( 4-463 ページ参照)。また、ちらっと見たり、見たりすることも忘れないでください。 int
sysenter
iretd
sysexit
操作の疑似コードを簡単に数えると、次のようになります。
注:既存の答えはその点で正しく、割り込みsysenter
でsyscall
はなく、割り込みに関連するものでもありませんが、LinuxおよびWindowsの世界の古いカーネルは、システムコールメカニズムを実装するために割り込みを使用していました。Linux では、これは以前int 0x80
は Windowsint 0x2E
でした。その結果、これらのカーネル バージョンでは、それぞれの割り込みの割り込みハンドラーを提供するために IDT を準備する必要がありました。新しいシステムでは、それは本当です。命令はsysenter
、syscall
古い方法を完全に置き換えました。ハンドラーのアドレスでプライミングされるのはMSR(マシン固有のレジスター)です(sysenter
以下にリンクされている読み物を参照してください)。0x176
sysenter
Windows では ...
Windows でのシステム コールは、Linux と同様に、カーネル モードへの切り替えになります。NT のスケジューラは、スレッドが許可される時間を保証しません。また、スレッドから時間が奪われ、スレッドが枯渇することさえあります。一般に、ユーザー モード コードはカーネル モード コードによってプリエンプトされる可能性があると言えます (ただし、「高度なドライバー作成クラス」で確実に得られる非常に特殊な例外はほとんどありません)。1 つの例だけを見れば、これは完全に理にかなっています。ユーザー モード コードをスワップ アウトすることができます。さらに言えば、アクセスしようとしているデータをスワップ アウトすることもできます。現在、CPU はスワップ/ページング ファイル内のページにアクセスする方法をまったく把握していないため、中間の手順が必要です。また、カーネル モード コードがユーザー モード コードをプリエンプトできる必要があるのもそのためです。IRQL_NOT_LESS_OR_EQUAL
. これは、そのメモリにアクセスするコードを先取りできなかったときに、ドライバーがページ メモリにアクセスしたことを意味します。
参考文献
- Geoff Chappellによる Windows の SYSENTER と SYSEXIT (私の経験上、常に読む価値があります!)
- Linux 2.6 の Sysenter ベースのシステム コール メカニズム
- Windows NT プラットフォーム固有の議論: Windows NT システム コールはどのように機能するのですか?
- Windows NT プラットフォーム固有の議論: SYSENTER 命令によるシステム コールの最適化
- Windows Internals、第 5 版、Russinovich らによる。アル。- 125 ~ 132 ページ。
- ReactOSの実装
KiFastSystemCall