4

物理的に隣接したDMA可能なメモリのいくつかのメモリブロックを管理するカーネルドライバを作成しようとしています(kmalloc()これらはDMAストリームのみであるため使用しています)。一部の機能をユーザースペースに取り込むには、このメモリをmmap()独自の実装で編集しmmap()ます。私はLinuxデバイスドライバーと、私の主な情報源としてGoogleに表示される悪い例を使用しています。

mmap()(今のところそれを呼んでmy_mmap()います)はカーネルに登録する必要があります。を使用してこれを行う唯一の有効な方法のようですstruct file_operationsが、これにはキャラクターデバイスとその物理的な場所を作成する必要があります。私はそれをしたくありません。ユーザースペースアプリケーションがメモリバッファにアクセスするための仮想アドレスを作成したいだけで、メモリバッファをマップするファイルを作成したくありません。これは可能ですか?

フレームバッファも実装と同等の構造を持っていることがわかりましたmmap()が、それはあまりにも多くのハックになります。それとそれはより多くの未知数を追加します。

私が理解しているように、私が失われた柔軟性にmy_mmap()問題がない限り、重い物を持ち上げて使用することができます。remap_pfn_range()それ以外の場合は、ローカルを実装し、nopages()を使用して登録する必要がありstruct vm_operations_structます。これは正しいです?

4

1 に答える 1

6

このmmap()操作は、あるソースを仮想アドレス空間にマップするためのユーザースペースからの要求です。ユーザースペースプログラムが関心のあるソースを識別する方法は、ファイル記述子(実際にはカーネルに認識されているリソースの単なるハンドル)を提供することです。

つまり、デバイスをファイル記述子として表現できるようにして、ユーザースペースプログラムがカーネルに関心があることを通知できるようにする必要があります(カーネルはmmap()実装を呼び出すことを認識しています)。これを行うには、キャラクターデバイスを登録するのが一般的な方法です。 。フレームバッファデバイスには、文字デバイスを介してアクセスすることにも注意してください。

デバイスにとって意味がない場合などread()、他のキャラクターデバイス操作を実装する必要はありません。write()キャラクターデバイスは、ユーザースペースプログラムがデバイスへのカーネル管理ハンドルを開くための単なる方法です。

于 2012-06-26T06:01:07.053 に答える