質問

しては、よく知られているプログラムの下での32ビットWindows®OSには2GBのメモリー可能です。ものとなることが知られているがその他の2GB予約してカーネル空間です。もうすることが求められていますがカーネル。

しかし準備に必要なカーネル自身が、なぜカーネル空間のVASのですか?感謝。

役に立ちましたか?

解決

の窓内させていただきますので記述するこgory。のための短いアトラクションは時代とともに、カーネルに仮想アドレス(KVA)スペース:

1)のカーネルのHAL

2)デバイスドライバ

3)カーネルのモードを盛るとともに、その実行プール、あるいは常に面白い)

4)オブジェにも輸出されユーザーモード経由で取り扱う、スレッド、イベント、ミューテックス等オブジェクト)

5)システムPTEs、地図のすべての種類の興味深いことから、ビーチへ直結のユーザーモードでアプリケーション例実行タスレッド利用時にカーネルモード)

6)キャッシュファイルシステム

の一覧については枚挙に暇がありませんように---と言って読Windows Internals.

-スコット

他のヒント

カーネルメモリはすべてのプロセスの仮想アドレス空間にマッピングされていることの理由は、カーネルモードへのコンテキストスイッチがプロセスのページテーブルを変更する必要はありませんので、ということです。現在の特権レベルが単にすぐにそれらのページにアクセスできるようになり0に持ち上げられます。

ページテーブルは異なるプロセスがに切り替えられたときに切り替えることがあります。これは高価な操作である(例えば、それはTLBフラッシュが必要)ので、それの頻度を最小限に抑えることが勝利です。

また、もしあなたののでしたのスイッチ特別なカーネルのページテーブルを使用すると、カーネル空間に切り替え行きで、あなたは交換するユーザ空間のアドレス空間の一部を選択する必要があると思います。これは、それらの領域内のデータがへたりカーネルから転送されることになっていた時期についていじくるバウンスバッファ以上のアドレス空間を必要とするカーネルへのそれらのユーザ空間のaddressessにアクセスできなくなるだろう。

私の意見では2GBの境界については、別のほとんど知られていない事実があります。多くのアプリケーションでポインタ演算の多くが付いている一般的な作業(特にアプリケーションはC、C ++で記述されました...)。これらのアプリケーションでは、ポインタにオフセットを追加するために、あるいはポインタを減算することは非常に一般的です。

あなたの使用可能な仮想アドレス空間が2GBであれば、あなたは二つのポインタを減算すると、-2147483647と2147483648の間で常にであることが保証されている(これらは32ビット符号付きの値に対する制限されている)。

あなたのアドレス空間が3ギガバイトになる場合は、可能な差は、32ビットの符号付き値で表現することができる任意の値よりも大きくなります。

あなたはあなたのアプリケーションが安全であることを知っている、と全く関係のないポインタを引いていない場合は(そして、あなたの配列は以下2GB以上です!)、あなたはあなたのアプリケーションがリンカを設定することで、2GBを超えるアドレス空間で動作することでWindowsを伝えることができますフラグLARGEADDRESSAWARE(又はEDITBINユーティリティでこれを設定する)。

XPで(ないかなり確実VistaとW7について)あなたは「カーネル空間」は1GBのみであり、仮想アドレス空間の3ギガバイトは、アプリケーションのために残されているモードで起動することができます。アプリケーションがLARGEADDRESSAWAREである場合は、完全な3ギガバイトを取得します。ない場合は、あなただけの2ギガバイトを取得します。

64ビットWindows上で

、LARGEADDRESSAWARE 32ビットアプリケーションでも4ギガバイトを取得し、Windowsが(すべての後に、それは64ビットOSです)32ビットの領域にかなりのアドレス空間を必要としないからです。

C ++のような高水準言語で書かれた

プログラムは、最終的にはOSのAPI呼び出し、WindowsのOSのための具体的には、WindowsのAPIに変換されます。多くのWindows APIは、CreateFileのように、実際には、カーネルモードドライバと話しています。プロセスのアドレス空間にカーネル空間は、このプロセスのためにカーネルリソースを割り当てるために使用されています。例えば、ドライバIOCTLコールはユーザ・モードAPIとドライバとの間に渡された入力 - 出力バッファを含みます。このようなバッファは、プロセスのカーネル空間に割り当てられます。

一般的に、カーネル空間は、このプロセスのためにカーネルモードコンポーネントによって割り当てられたリソースが含まれています。

あなたの質問はあると思われる「なぜ」ではなく「何を」のタイトルで前方に置くようます。

また、あなたの質問には、32ビットを前提としています。ウィンドウの64ビットバージョンはかなり異なっている(例えば、VASは8TB、または7TBは、Itaniumシステム上にあります)。

は、「なぜ」については、どのようにプロセスのVASに含まれていない(ドライバのような)カーネル関数からポインタを渡すのでしょうか?このアウトを理解するために読むのに良い本は Windowsの内部になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top