2016-07-29 25 views
2

私は、PCIデバイス用のドライバのようなコードで作業しています。通信はバッファを介して行われる。すなわち、バッファに書き込む。そして、デバイスは、バッファからデータを取得する。バッファへのデバイス書き込みとそのバッファからのI gradデータ。ここで問題が発生します。デバイスがこのバッファに書き込むためには、物理​​アドレス(仮想アドレスではない)が必要です。私の上司は、私がカーネルモジュールを書いてkmallocを使ってメモリを割り当てるなら、それを実行することができると私に言った。カーネル空間からユーザ空間へ物理メモリへのポインタを渡して仮想空間にマップする方法

ここに私の質問があります。 ユーザ空間からこのバッファにアクセスするにはどうすればよいですか?つまり、このバッファへのポインタをカーネル空間からユーザ空間に渡すにはどうすればよいですか?ユーザー空間のすべてのアドレスは仮想アドレスなので、物理バッファを仮想バッファに変換するにはどうすればよいですか?私が理解する限り、私はioctlを使用する必要がありますが、私はどうやっていません。

何か助けていただければ幸いです。

+0

もし私がこれを行うのであれば、おそらくグラフィックスドライバのDRMを見てみるとよいでしょう。 – doron

+4

ドライバに 'mmap'を実装してください。詳細については、[Linux Device Drivers](http://www.xml.com/ldd/chapter/book/ch13.html)を参照してください。 – kaylum

+0

@kaylumそれは私が先週読んできた本です。私は自分のケースについて適切な章を見ましたが、私は 'mmap'が正しいアプローチだとは思わない。トリックは、私がバッファを割り当てる必要があるということですが、デバイスがバッファに書き込むためには、バッファの物理アドレスが必要です。 – flashburn

答えて

0

多分あなたはNetlinkソケットAPIを使うことができます。このリンクはあなたに役立つかもしれませんHow to use netlink socket to communicate with a kernel module?

+0

応答に感謝しますが、これは私が探しているものではありません。私が言ったように、通信はバッファを介して行われ、ユーザはバッファ割り当てを担当する。しかし、デバイスは、そこからデータを読み書きするために、このバッファの物理アドレスを持つ必要があります。 – flashburn

1

これはPCIデバイスの場合、マップする必要がある物理アドレスよりもすでに物理アドレスがあります。デバイスにはクラスとサブクラスIDがあります。あなたのクラスとサブクラスのIDが一致するまで、あなたのすべてのpciデバイスをスピンアップしてからバスアドレスを取得します。

あなたが、私はこのことができます願っていたmmap

C++ app to talk to an FPGA over PCI in userland using mmap

を使用して、物理アドレスをマッピングします。

関連する問題