システム メモリに無制限にアクセスできる Win32 アプリケーション (C/C++) を作成したいと考えています。それが可能かどうか知りたいだけです。可能であれば、そのアプリケーションを作成する最短の方法を知りたいです。ありがとう。
2 に答える
システム メモリにアクセスする唯一の方法は、カーネル モード ドライバーからです。ですから、これをやろうとするなら、そのようなことを書かなければなりません。
ページ テーブルのマッピングを変更するには、カーネル ドライバーが必要です。メモリがプロセスのアドレス空間にマップされると、ユーザー モード プロセスがメモリにアクセスできるようになります。もちろん、これには重大な警告が伴います。アプリケーションがカーネル メモリ領域にアクセスすると、システムが簡単に不安定になったり、さらに悪化する可能性があります。 もちろん、マッピングを直接変更するのではなく、API を使用して仮想メモリ マネージャーと連携して変更を行う必要があります。そうしないと、エントリが予期した場所にない場合、カーネル メモリ管理が非常に混乱する可能性があります。
非常に限られた場合を除いて、既存のカーネル コードがそのようなアクセスを提供しないことを除いて、ユーザー モード アプリケーションが他のプロセスに属するメモリにアクセスすることを妨げるものは何もありません。たとえば、ファイル マッピングは既に共有メモリを使用しており、ユーザー モード プロセスがカーネル所有のページ (ディスク キャッシュが所有) にアクセスできるようにしています。
仮想アドレスは依然として物理アドレスと一致しないことに注意してください。物理アドレスを直接使用できるのはカーネル コードだけです。したがって、これを DMA などに使用するのは難しいでしょう。
(I/O ポートに対してこれを行うカーネル ドライバーを知っています -- giveio.sys は、ハードウェア監視ソフトウェアでよく使用されます。メモリ ページ アクセスに使用できるかどうか、または別のものを見つける必要があるかどうかはわかりませんLinux では、/dev/kmem
デバイスを介してユーザー コードがすべてのメモリにアクセスできるようにする、広く利用可能なカーネル モジュールがあります/dev/kmem
。要求しているプロセスと、Windows ドライバーはほぼ同じことを行うことができます)。
最短の方法は、間違いなく、このための ioctl を公開している既存のドライバーを見つけることです。その時点で、ユーザー モード アプリケーションはドライバーをインストールしてロードし、その ioctl を使用して必要なページをプロセスにマップするだけで済みます。ドライバーとデバイスを管理するためのユーザーモード API (もちろん管理者権限を使用) については、十分に文書化されています。