0

オブジェクト コードにコンパイルされた後、オブジェクト ファイルが静的または別の方法でリンクされると、それらは に配置されます[VAD][1]。少なくとも、2000 年代後半にさかのぼる最新の Windows オペレーティング システムでは、これを確実に知っています。私の推測では、これは私の頭の上からのものですが、動的にリンクされたカーネル ライブラリは、メインの実行可能ファイルと共に TBL のページ化された仮想アドレス空間に配置され、動的にリンクされたライブラリが存在する場合は、C の標準のように、それらはメインの実行可能ファイルと一緒にリンクされていますが、静的なもの[SDL][2]はそうではありません。では、実行可能ファイルは、リンクされたカーネル ライブラリを介して、ドライバーなどの保護されたメモリにどのようにアクセスするのでしょうか?

私の質問があまり混乱しないことを願っています。

基本的に、私が聞きたいことは、最短の質問では次のとおりです。

コンパイル済み/リンク済みの実行可能ファイルとそれに付随するライブラリ/API は、実行時のハードウェア操作に必要な OS API、カーネル API、またはその他のシステム ソフトウェアに実際にどのように到達し、対話するのでしょうか?

4

1 に答える 1

0

私はWindowsについてのみ話すことができます=)まず、スレッドにはコンテキストがあり、カーネルモードスタックとユーザーモードスタックの2つのスタックが含まれます。CPU にはコマンドがあります - SYSENTER。これらの命令は、カーネル モード エントリ ポイントを記述する MSR レジスタ IA32_SYSENTER_* を使用します。呼び出されると、現在のレベルをリング 0 に切り替え、スタックをカーネル モード スタックに切り替え、km エントリポイントを呼び出します。Windows では、このエントリ ポイントは KiFastCallEntry と呼ばれます。基本的に、これらの関数は KiSystemService () を呼び出します。これは、UM コンテキストをスタック (KTRAP) に保存し、引数をコピーして、適切なシステム サービスを呼び出します (ユーザーモードは、システム サービス記述子テーブルにインデックスを提供します)。その後、KiSystemService は KTRAP からユーザーモード コンテキストを設定し、sysexit を呼び出します。これにより、現在の特権レベルが 3 に切り替わり、スタックがユーザーモードに切り替わり、制御が呼び出し元に転送されます (基本的にこれは ntdll スタブです)。

これはあまり貴重な説明ではありません (たとえば、いくつかのサービス記述子テーブルなどがあります)。「Windows Inside」またはhttp://shift32.wordpress.com/2011/10/14/inside-kisystemservice/およびhttp://wiki.osdev.org/SYSENTER#Compatability_across_Intel_and_AMDのようなものを読むことができます

于 2013-07-01T06:14:34.277 に答える