9

カーネルとユーザーモードのWindowsプロセスに関連するいくつかの質問があります。

hello worldアプリケーションと、新しいシステムコールfoo()を公開するhello worldドライバーがある場合、カーネルモードになったら何ができるか、何ができないかについて興味があります。

手始めに、新しいhello worldアプリを作成すると、新しいプロセスが与えられます。つまり、独自のユーザーモードVMスペースがあります(シンプルな32ビットウィンドウを維持しましょう)。だから私は「所有」している2GBのスペースを持っているので、心が満足するまで突いて覗くことができます。しかし、私は自分のプロセスに縛られています。私は(共有メモリをまだこれに持ち込まないように)他の人のメモリに触れることはできません。

このhelloworldドライバーを作成し、ユーザーアプリから呼び出すと、私(ドライバーコード)はカーネルモードになります。

最初の説明/質問:私はまだユーザーモードアプリと同じプロセスにいますよね?まだ同じPIDを持っていますか?

メモリの質問:メモリはVMとしてプロセスに提示されます。つまり、1 GBのRAMがある場合でも、4 GBのメモリにアクセスできます(2GBのユーザー/2GBのカーネル-サーバー上のスイッチの詳細や詳細は気にしないでください。ここでの一般的な仮定)。ユーザープロセスとして、カーネルモードのメモリアドレスを確認することはできませんが、ユーザースペースに対してやりたいことは何でもできますよね?

ドライバーコードからHelloWorldドライバーを呼び出した場合でも、ユーザーモードメモリの同じビューがありますか?しかし、今ではカーネルモードのメモリにもアクセスできますか?

このカーネルモードのメモリは共有されていますか(私自身のプロセスのコピーであるユーザーモードとは異なります)?つまり、ドライバーを作成することは、OSである単一のプロセス用のスレッド化されたアプリケーションを作成することに似ています(スケジュールは別として?)

次の問題。ドライバーとして、実行しているプロセスを変更できますか?たとえば、別のアプリ(たとえば、ユーザーモードのウェブサーバー)を知っていて、そのプロセスのVMをロードし、そのプロセスの命令ポインターを変更したり、スタックしたり、プロセスに別のコードをロードしたりしてから、自分のアプリに切り替えますか?(私はここで悪意のあることを何もしようとはしていません。カーネルモードであることが実際に何を意味するのか興味があります)?

また、カーネルモードになったら、OSがプリエンプトしないようにすることはできますか?(Windowsでは)これを行うためにIRQLレベルを設定できると思いますが、Solomonsの本(Windowsの内部...)を読んだ後でも、これを完全には理解していません。IRQL / DPCに直接関連する別の質問をしますが、今のところ、カーネルドライバーがIRQLをHighに設定してシステムを引き継ぐ能力を持っているかどうかを知りたいと思います。

今後さらに増えるが、これらの質問への回答が役立つだろう。

4

2 に答える 2

8

各プロセスには、特にそのプロセスに固有のVMマッピングを含む「コンテキスト」があります(通常、32ビットモードでは2 GB未満)。ユーザーモードで実行されているスレッドがカーネルモードに入ると(たとえば、システムコールまたはIO要求から)、プロセス内で同じスレッドが同じコンテキストで実行されたままになります。PsGetCurrentProcessIdは、この時点で、GetCurrentProcessIDがユーザーモードの直前に持っていたものと同じものを返します(スレッドIDと同じ)。

コンテキストに付属しているユーザーメモリマッピングは、カーネルモードに入っても引き続き有効です。カーネルモードからユーザーメモリに直接アクセスできます。ただし、これを安全に行うために実行する必要のある特別なことがあります。バッファリングされたI/Oも直接I/Oも使用しない。特に、ユーザースペース範囲で無効なアドレスアクセスを試行すると、キャッチする必要のあるSEH例外が発生し、そのプロセス内の別のスレッドのアクションにより、ユーザーメモリの内容がいつでも変更される可能性があります。カーネルアドレス範囲内の無効なアドレスにアクセスすると、バグチェックが発生します。ユーザーモードで実行されているスレッドは、カーネルメモリにアクセスできません。

カーネルアドレス空間はプロセスのコンテキストの一部ではないため、すべてのプロセス間で同じようにマップされます。ただし、カーネルモードでは、一度に任意の数のスレッドがアクティブになる可能性があるため、シングルスレッドアプリケーションとは異なります。一般に、スレッドはカーネルモードに入ると、独自のシステムコールを処理します(すべての要求を処理するための専用のカーネルワーカースレッドを持つのとは対照的です)。

スレッドとプロセスの状態を保存する基本的な構造は、すべてカーネルモードで使用できます。別のプロセスのVMのマッピングは、そのプロセスからMDLを作成し、それをシステムアドレス空間にマッピングすることにより、他のプロセスから事前に行うのが最適です。別のスレッドのコンテキストを変更したいだけの場合、これは完全にユーザーモードから実行できます。競合状態を起こさずにコンテキストを変更するには、スレッドを一時停止する必要があることに注意してください。カーネルモードからプロセスにモジュールをロードすることはお勧めできません。すべてのローダーAPIは、ユーザーモードからのみ使用するように設計されています。

各CPUには、実行中の現在のIRQLがあります。これは、CPUが現在実行していることを中断できるものを決定します。より高いIRQLからのイベントのみが、CPUの現在のアクティビティをプリエンプトできます。

  • PASSIVE_LEVELすべてのユーザーコードとほとんどのカーネルコードが実行される場所です。多くのカーネルAPIでは、IRQLがPASSIVE_LEVEL
  • APC_LEVELカーネルAPCに使用されます
  • DISPATCH_LEVELスケジューライベント用です(NTの用語ではディスパッチャと呼ばれます)。このレベルで実行すると、スケジューラーによってプリエンプションされるのを防ぐことができます。このレベルでページフォールトが発生するのは安全ではないことに注意してください。メモリマネージャがページを取得しようとすると、デッドロックが発生する可能性があります。カーネルは、ページフォールトDISPATCH_LEVEL以上の場合、すぐにバグチェックを行います。これは、ページプール、ページコードセグメント、またはロックされていない(つまり、MDLによって)ユーザーメモリに安全にアクセスできないことを意味します。
  • この上には、ハードウェアデバイスの割り込みレベルに接続されたレベルがありますDIRQL
  • 最高レベルはHIGH_LEVELです。このレベルを先取りすることはできません。これは、バグチェック中にカーネルがシステムを停止するために使用します。

スケジューリング、スレッドコンテキスト、およびIRQLを読むことをお勧めします

于 2009-09-04T15:05:46.637 に答える
4

このトピックの優れた入門書は、http://www.codinghorror.com/blog/archives/001029.htmlにあります。

ジェフがユーザーモードのメモリスペースについて指摘しているように:

「ユーザーモードでは、実行中のコードはハードウェアまたは参照メモリに直接アクセスできません。ユーザーモードで実行されているコードは、ハードウェアまたはメモリにアクセスするためにシステムAPIに委任する必要があります。この種の分離によって保護されるため、ユーザーモードでクラッシュします。コンピュータで実行されているコードのほとんどは、ユーザーモードで実行されます。」

そのため、アプリはカーネルモードのメモリにアクセスできなくなります。実際、ドライバーとの通信はおそらくIOCTL(つまり、IRP)を介して行われます。

ただし、カーネルは、ユーザーモードプロセスのマッピングを含むすべてにアクセスできます。これは一方通行です。セキュリティと安定性の理由から、ユーザーモードをカーネルモードにマッピングすることはできません。カーネルモードを介しても、ドライバーはユーザーモードのメモリにマップできます。

少なくとも、それはWDFの前に戻った方法です。ユーザーモードドライバーを使用したメモリマッピングの機能がわかりません。

参照:http ://www.google.com/url?sa = t&source = web&ct = res&cd = 1&url = http%3A%2F%2Fdownload.microsoft.com%2Fdownload%2Fe%2Fb%2Fa%2Feba1050f-a31d-436b -9281-92cdfeae4b45%2FKM-UMGuide.doc&ei = eAygSvfuAt7gnQe01P3gDQ&rct = j&q = user + mode + mapping + into + kernel + mode&usg = AFQjCNG1QYQMcIpcokMoQSWJlGSEodaBHQ

于 2009-09-03T18:38:43.847 に答える