問題タブ [dma]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux-kernel - DMA の仕組み -- ARM で -- Linux を使用
Linux DMA の専門家が私を助けてくれませんか... この概念を理解するために。
a> DMA プログラミングは初めてです。DMA は実際に ARM コントローラに対してどのように機能しますか?
b> データをドライバーに送信するために mmap を使用している場合。これを DMA とどのように同期できますか?
c> DMA を使用するには、ソフトウェアで実際に何をしなければなりませんか?
d> この DMA 入力出力チャネルは何ですか?
サンプルコードはありますか.. DMA が初めてなので、概念を理解するのに役立ちます。
fwrite - 連続した物理メモリからハードディスクへの書き込み
カメラに接続されたLinuxを実行しているARMベースのデバイスがあり、キャプチャしたフレームをHDに効率的に保存しようとしています。
- ユーザー空間で開発していますが、ドライバーを自由に変更できます
- Cでコーディングしています
- DMA を使用してメモリに書き込まれるフレームで、物理メモリ ポインタがあります。
- すべてのフレーム キャプチャ フローを制御でき、フレーム バッファがいつ安定するかを知ることができます (video4linux ドライバからキューから削除されます)。
- Linux のバージョンは 3.0.35 です
- 私はカーネルのソースコードに精通しており、専門家ではありませんが、いくつかのヒントが得られる限り、その方法を見つけて物事を理解することができます...
私は2つの選択肢があると信じています:
ファイルを開いて書き込むための、ファイルシステムの最適な構成を見つけます。現在、ext4 と標準の fopen() fwrite() 関数を使用しています。mmap を使用したり、open() を呼び出すときに O_DIRECT フラグを追加したりできることは理解していますが、まだ試していません。
バッファーの物理アドレス (Video4Linux ドライバーから取得できます) をファイルシステム/ハード ドライブ ドライバーに直接渡す方法を見つけて、データがそこから直接転送されるようにします。
fwrite はデータをユーザー空間からカーネル空間にコピーし、次にある種のキャッシュにコピーし、次に DMA にコピーするため、方法 1 は遅く、メモリ トランザクションがボトルネックになっていることがわかりました。単純なストアにはメモリ トランザクションが多すぎます...
方法 2 について - それが可能かどうかはわかりませんが、私がこのシステムをゼロから設計する立場にあるとしたら、これを行うでしょう。
何かご意見は?
- 方法 1 (open() と write()、mmap() および/または O_DIRECT を使用) に関して、私の目的に最適な設定をお勧めできますか?
- 方法 2 (既存の DMA バッファから直接 HD に格納する) は可能ですか? もしそうなら、例を挙げてもらえますか?
windows - 32 ビット PCI デバイス用の Windows 64 ビット デバイス ドライバーの作成
数年前に書いたデバイス ドライバを 32 ビットから 64 ビットに移植することを評価しています。物理デバイスは 32 ビット PCI カードです。つまり、デバイスは 32 ビットですが、Win7x64 からアクセスする必要があります。デバイスは、Windows の世界にいくつかのレジスタを提示し、ドライバーが割り当てたメモリのチャンクに大量のバス マスター データを転送します。
Microsoft のドキュメントで、ドライバーが 64 ビット DMA をサポートしているかどうかを通知できると読みました。そうでない場合、DMA はダブル バッファリングされています。ただし、これが事実かどうかはわかりません。私のドライバーは完全な 64 ビットのドライバーである可能性があるため、プロセッサーのアドレス空間で 64 ビットのアドレスをサポートできますが、実際の物理デバイスはそれをサポートしません。実際、デバイス BAR は 4 GB 未満でマップする必要があり、デバイスは 4 GB 未満でバス マスターを実行するために PC RAM アドレスを取得する必要があります。これは、ドライバーが常にダブル バッファリングを行うということですか? これはパフォーマンスが非常に重要なプロセスであり、ダブル バッファリングによってシステム全体が機能しなくなる可能性があります。
もちろん、新しい 64 ビット PCI (または PCI-E) ボードを設計することは論外です。
このプロセスに関するリソースを提供してくれる人はいますか (MS ページは別として)。
どうもありがとう!
c - dmatest.ko - どのように使用しますか?
テストのために DMA 転送を開始したいと考えています。
カーネル ソース (drivers/dma) で dmatest.c を偶然見つけました。このモジュールでカーネルをコンパイルし、パラメータなしで試しました。
そして私はdmesgで取得します
dmatest.ko の前提条件は何ですか? 特別な DMA エンジンをロードする必要がありますか? dmatest.ko の特別なパラメーターは必要ですか (デフォルトでは何かをプローブする必要があります!?)?
io - 「I/Oポートからバイトを読み取る」と「メモリのアドレスからバイトを読み取る」?
説明を簡単にするために、実行中のスレッドは1つだけだと思います。以下は私の野蛮な憶測です。
1、CPUがメモリのアドレスからバイトを読み取る場合、同じアドレスから同じ値を繰り返し読み取ることができます。
2、CPUがポートからバイトを繰り返し読み取る場合、CPUは毎回異なる値を読み取る可能性があります。
2つの方法の違いは、ポートコントローラが各読み取り操作の後にポートの値を自動的に更新できることだと思います。
しかし、自分の発言を明確に裏付ける教科書は見つかりませんでした。
私は正しいですか?
device - KVM - パススルー デバイスを使用した DMA
私はいくつかの仮定を念頭に置いていますが、間違っている場合は修正してください。
- 実際の IOMMU がないと、ゲストがホスト メモリ内のガベージを転送する可能性があるため、DMA 転送はセキュリティ リスクになります。
- 実際の IOMMU なしでは、ゲスト メモリとパススルー デバイス間の有効な DMA 転送はできません。
- ホスト OS は、パススルー デバイスに関連する DMA 関連のものを認識しません。
今いくつかの質問:
- ポイント 3 に関連: パススルー デバイスを使用して DMA 転送に関する情報を取得する方法はありますか?
- DMA-Remapping をオンにしていない場合、KVM はそれについて文句を言いますか?
- パススルー デバイスを使用して、ゲストの DMA 関連のものを拒否する可能性はありますか?
fpga - FPGA PCIe DMA write doesn't change CPU RAM
I am working on DMA connection between Xilinx FPGA and PC over PCIe. However, the DMA transfer from FPGA to Computer doesn't work. I dumped the PCIe package sent by FPGA via ChipScope:
(header)0x6000_0002,0x0600_01FF,(Address)0x0000_0000,0x3740_0000,(data)0x0000_0001,0x0000_0002
which should write 0x1,0x2 to memory address 0x3740_0000, but the write didn't happen. On the other hand, the read from the same address worked perfectly. I have tried both the 32bit and 64bits address, none of them could be succeed. The computer I am working on is an AMD 64bit machine. what did I miss?
linux - dma_mapとdma_unmapについてもっと知りたい
誰かがdma_unmapが必要な理由についての簡単なドキュメントを教えてもらえますか?dma_mapでも自由に説明してください。デバイスドライバーは初めてです。
ありがとう
c# - Windows XP で 500 MB の DMA バッファを割り当てる方法
PC には PCI カードが接続されており、そのための GUI があります。PCI カードから読み書きするために、RAM に約 400 ~ 600 MB の物理メモリの DMA バッファを割り当てたいと考えています (FPGA は PCI カードで読み書き操作を行います)。JUNGO Windows PCI ドライバーを使用しています。Contiguous または scatter/Gather メソッドを介して DMA バッファを割り当てるために、JUNGO が提供する WDC_DMAContigBufLock メソッドがあります。RAM に最大 63MB のバッファを作成でき、63MB を超えるバッファは作成できませんでした。OSはWindows XP 32bitでRAMサイズは4GB(比較的3GBは無料)。
アプリケーション (GUI) は C# .Net で記述されており、400 ~ 600MB の DMA バッファを作成しようとするのは、このアプリケーションを使用することです。400 - 600MB のバッファ サイズを作成する原因となる/停止する可能性のある解決策/アイデアを探しています。
ありがとう
linux-kernel - 大きな DMA バッファの割り当て
サイズが約 40 MB の大きな DMA バッファを割り当てたいと考えています。を使用するdma_alloc_coherent()
と失敗し、次のように表示されます。
さまざまな値を試してみましたがdma_alloc_coherent()
、2^25 バイト (32 MB) を超える割り当てができないようです。
このような大きな DMA バッファをどのように割り当てることができますか?