私の友人と私は、高度なオペレーティングシステムクラスの仮想デバイス用のデバイスドライバ(読み込み:PCIまたはUSBではない)を作成しようとしています。私たちはUbuntu 16.04を使用しています。私たちの仕事は、ドライバのIOCTLを呼び出して、RGB値(整数の配列)、空の宛先バッファ、および長さでいっぱいのソースバッファを与えることです。 DMAコントローラを呼び出してソースバッファの内容をデスティネーションバッファに転送し、次にデスティネーションバッファの所定の位置にある値に線形変換を適用します。LinuxでメモリからメモリへのDMA転送が可能ですか?もしそうなら、どの機能が転送を開始するためにDMAを呼び出すのでしょうか?
私たちはDMAなしで変換を成功させ、私たちのデバイスにDMAチャンネルを割り当てました。私たちは、DMAを使って転送を開始することを記述するのどこでもの機能を見つけることができないという問題があります。我々は完了時に割り込みを発生させたい(ドライバーは、転送が完了するのを待ってスピンしてはならない)。
このプロセスを説明する関数の定義がどこにあるかわかりたいと思います。この作業を完了するためのコードや正確な方法は求めていません。どの機能を使用できるか、そして/またはどのヘッダファイルを見つけるのかを知りたいだけです。私たちはlinux/dma-mapping.hを見て、一見奇妙なものです。 LDD3についてはしばらくの間見てきましたが、実際にDMA転送を開始するためにどの機能を使用するべきかについての情報をあまり与えずに、DMAを設定するプロセスを徹底的に行っているようです。 drivers/dma
ディレクトリにできるメモリ間コピーのローカルDMAエンジンをサポートするために、最近のLinuxカーネルで「DMAエンジン」のAPIがあります