3


4

Windowsカーネルモードドライバーはどのようにページメモリにアクセスしますか?

1)ユーザーモードプロセスには独自の「アドレスコンテキスト」があり、ユーザーモードの仮想アドレスを物理ページフレームの一意のコレクションにマップします。 つまり、特定の仮想アドレスの*意味*は、Windows XPスケジューラーがスレッドを切り替えるときに、時々刻々と変化します。

「スレッドの切り替え」の作業の一部は、着信スレッドのプロセスコンテキストを参照するようにページテーブルを変更することです。

_

2)Windowsカーネルモードドライバーは、「任意のスレッドコンテキスト」で実行されます。

ドライバーはシステムスレッドを作成し、そのコンテキストで動作する場合がありますが、システムスレッドを作成しない状況について説明しています。

ドライバーは、 "ExAllocatePoolWithTag"を使用して、ページ化された(揮発性ストレージのメモリ)を割り当てることができます。

_

3)では、ドライバーはどのようにページメモリにアクセスしますか?

ポイント1に見られるように、ページ化されたmemは、「コンテキスト固有」のページテーブルを介してアクセスされます。

ドライバーが他のスレッドコンテキストで実行されるとき…​つまり ページテーブルエントリは、スレッドに関連するphyを指します。 mem、ドライバーはどのようにしてページメモリにアクセスできますか?

PS:カーネルプログラミングの初心者。 怒らないで。

2 Answer


7


使用される概念は、「ユーザー/カーネルアドレススペースの分割」です。 各プロセスのアドレス空間は、ユーザーモードでプロセスにアクセス可能でプロセスごとに異なる下部(通常2 GB)と、カーネルモードでのみアクセス可能な上部(​​残りのアドレス空間)に分割されます。すべてのプロセスの_same_。

ドライバーがページメモリを割り当てると、アドレス空間分割のカーネル側に割り当てられるため、その時点でページテーブルが読み込まれるプロセスに関係なく、カーネルコードから見えるようになります(アドレス空間のこの部分はすべてのプロセスで同じ方法)。


0


主な注意点は、すべてのスレッドが同じカーネルメモリマッピングを持っていることです。 したがって、スレッド間のコンテキスト切り替えは、仮想メモリの上位2GBに(ほとんど)影響を与えません。