カーネルとユーザーモードの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に設定してシステムを引き継ぐ能力を持っているかどうかを知りたいと思います。
今後さらに増えるが、これらの質問への回答が役立つだろう。