LinuxでCPUがユーザーモードからカーネルモードにどのように変化するかについて研究しています。私は2つの異なる方法に出くわしました:割り込みと使用sysenter
。
仕組みがわかりませんでしsysenter
た。誰かがsysenter
命令が実行されたときにCPUで正確に何が起こるかを説明できますか?
LinuxでCPUがユーザーモードからカーネルモードにどのように変化するかについて研究しています。私は2つの異なる方法に出くわしました:割り込みと使用sysenter
。
仕組みがわかりませんでしsysenter
た。誰かがsysenter
命令が実行されたときにCPUで正確に何が起こるかを説明できますか?
プログラムがカーネルに入りたいときに直面する問題(別名「システムコールの作成」)は、ユーザープログラムがカーネル関連のものにアクセスできないことですが、プログラムは何らかの方法でCPUを「カーネルモード」に切り替える必要があります。
割り込みでは、これはハードウェアによって行われます。
また、存在しないメモリへのアクセス、ゼロによる除算、ユーザーコードでの特権命令の呼び出しなど、(C ++ではなくCPU-)例外が発生した場合にも自動的に発生します。または、実装されていない命令を実行しようとしています。この最後のことは、実際には「カーネルの呼び出し」インターフェイスを実装するための適切な方法です。CPUは、CPUが認識していない命令で実行されるため、CPUをカーネルモードおよびカーネルにドロップする例外を発生させます。次に、カーネルコードは、「正しい」実装されていない命令が使用されているかどうかを確認し、使用されている場合はsyscallを実行し、他の実装されていない命令の場合はプロセスを強制終了します。
もちろん、このようなことをすることは、まあ、「クリーン」ではありません。これは、完全に有効な制御フローの変更を実装するためにエラーとなるはずのものを悪用する、汚いハックのようなものです。したがって、CPUには、より「定義された」方法で、本質的に同じことを実行する実際の命令がある傾向があります。「sysenter」命令のようなものの主な目的は同じです。CPUを「カーネルモード」に変更し、「sysenter」が呼び出された位置を保存し、カーネルのどこかで実行を継続します。
「ソフトウェア割り込み」と「sysenter」の違いについて:「sysenter」は、この種のユースケース向けに特別に最適化されています。たとえば、(ソフトウェア)割り込みのようにメモリから呼び出すカーネルアドレスを取得しませんが、代わりに特殊レジスタを使用してアドレスを取得します。これにより、メモリアドレスの検索が節約されます。また、ソフトウェア割り込みは割り込みのように処理される可能性があり、sysenter命令は実際にはそれを必要としないという事実に基づいて、内部で追加の最適化が行われる場合があります。CPUでのこれらの命令の実装の正確な詳細はわかりません。そのような詳細を実際に理解するには、おそらくIntelのマニュアルを読む必要があります。