問題タブ [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.

0 投票する
2 に答える
39267 参照

caching - cache - フラッシュおよび無効化操作

キャッシュ同期操作についていくつか質問があります。

Invalidate : cpu がデバイスによって更新されたメモリの一部を読み取ろうとする前に、対応するメモリを無効にする必要があります。

Flush : デバイスが CPU によって更新されたメモリの一部を読み取る前に、CPU は内容をキャッシュからメモリにフラッシュする必要があります (書き戻しも正しいですか?)。これにより、デバイスは更新された内容でメモリから内容を読み取ります。

フラッシュが実行されない場合、キャッシュに書き込まれた内容でメモリがまだ更新されていないため、メモリに存在するジャンク データが読み取られる可能性があります。

私の上記の理解が正しいか確認してください。

いつフラッシュと無効化の両方を組み合わせたいですか? デバイス制御記述子で遊んでいるときに、フラッシュと無効化を組み合わせて同期する必要があると聞きました。なんでそうなの?

フラッシュの後に無効化が続くようなシーケンスに従う必要がありますか?

無効化に続いてフラッシュが役立つシナリオはありますか?

0 投票する
1 に答える
3092 参照

linux - DMA転送に使用するユーザースペースからの物理メモリの作成

DMA転送に使用するメモリを作成したいと思います。(Linux 2.6.18-128.el5#1 SMPを使用)

H / W用のAPIスタック+カーネルドライバーがあり、これを実行できますが、非常に低速です。

APIを使用してDMA転送を作成すると、システムRAMの非常に高い位置にメモリが割り当てられます(たとえば、1回の実行で0x7373a6f8)。(私はデバイスのICDを持っているので、メモリマップをmmapしてもらいます。これが、このアドレスを見つける方法であり、最終的には自分のアドレス、つまり/ dev/memに設定する方法です。下の地図で)

おそらく仮想メモリ空​​間が不足していて、カーネルによってブロックされているため、この上位アドレスの周囲でメモリをmmapできないようです。

私ができるようにしたいのは、指定されたこのアドレスを使用(マップ)して読み取り/書き込みを実行するか、読み取り/書き込みが可能な独自の物理メモリを作成することです。

0 投票する
3 に答える
6658 参照

linux - Linux DMA / デバイス ドライバー / メモリ割り当ての学習をどこから始めるか

デバイス ドライバー (別のカーネル モジュールで使用されている) を移植/デバッグしていますが、カーネル oops で dma_sync_single_for_device() が失敗するため、行き止まりに直面しています。

私はその機能が何をするべきか見当もつかないし、グーグルもあまり役に立たないので、おそらくこのことについてもっと学ぶ必要がある.

問題は、どこから始めればよいかということです。

そうそう、関連する場合に備えて、コードは PowerPC で実行することになっています (Linux は OpenWRT です)。

編集: オンライン リソースが望ましい (書籍の配信には数日かかります :)

0 投票する
2 に答える
4781 参照

linux - パケットがキャプチャされた後はどうなりますか?

パケットがNICによってキャプチャされた後に何が起こるかについて読んでいますが、読むほど混乱します。

まず、従来、パケットがNICによってキャプチャされた後、カーネルスペースのメモリブロックにコピーされ、次にパケットデータを処理するアプリケーションのユーザースペースにコピーされることを読みました。次に、DMAについて読みました。ここでは、NICがCPUをバイパスしてパケットをメモリに直接コピーします。では、NIC->カーネルメモリ->ユーザースペースのメモリフローはまだ有効ですか?また、ほとんどのNIC(Myricomなど)はDMAを使用してパケットキャプチャレートを向上させていますか?

次に、RSS(Receive Side Scaling)はWindowsシステムとLinuxシステムの両方で同様に機能しますか?RSSがどのように機能するかについての詳細な説明はMSDNの記事でしか見つけることができません。そこでは、RSS(およびMSI-X)がWindows Server 2008でどのように機能するかについて説明しています。しかし、RSSとMSI-Xの同じ概念はLinuxシステムにも当てはまります。 ?

ありがとうございました。

よろしく、レイン

0 投票する
1 に答える
695 参照

linux-kernel - Linux デバイス ドライバーは、DMA が device_remove() 関数で終了するのを待つことができますか?

PCI デバイス用の Linux デバイス ドライバーを作成しました。このデバイスは DMA 操作を実行します。DMA 操作の実行中にプログラムがクラッシュすると、問題が発生します。

実際、クラッシュすると、device_remove()関数はシステムによって呼び出されます (呼び出されたかのようclose()に)。この関数は、PCI デバイスが使用するメモリ領域をクリーンアップし、割り当てられたメモリを正しく解放します。つまり、通常の状況では正しく機能します。

ただし、DMA が実行されている場合、実際に終了すると、解放されたデバイス データにアクセスできなくなるため、DMA のクリーンアップを実行できなくなります。簡単な解決策は、close() 関数で待機することです。(これは私の理解ですが、DMA関数の最後の部分が実行されることはありませんか?)

DMA がデバイス ドライバのdevice_remove()(別名) 関数で実際に終了するのを嘆くのは良い考えですか? close()この問題に対処する他の手段はありますか?

0 投票する
3 に答える
645 参照

c++ - opengl vbo dma 配列

描画する位置の配列を作成していますが、配列に dma を使用しているときにスタックします

配列のサイズを宣言して入力すると、動作させることができますが、そうすると

鈍くて、何をする必要があるのか​​ 考えられない

0 投票する
3 に答える
7236 参照

c - RAMからRAMへのDMA転送

私の友人は、x86アーキテクチャではDMAコントローラが2つの異なるRAMロケーション間で転送できないと言っています。RAMと周辺機器(PCIバスなど)の間でのみ転送できます。

これは本当ですか?

AFAIK DMAコントローラは、BUS上にあり、アドレスを持つ任意のデバイス間で使用できる必要があるためです。特に、送信元アドレスと宛先アドレスの両方が同じ物理デバイスに属していても問題はありません。

0 投票する
7 に答える
62913 参照

memory-management - Linuxカーネルのページサイズをプログラムで取得する方法

IA64 用の Linux モジュールに取り組んでいます。現在の問題は、dma ページの割り当てにドライバーが PAGE_SIZE マクロと PAGE_SHIFT マクロを使用していることです。私が抱えている問題は、ドライバーをコンパイルするマシンが、ドライバーを実行するために必要なマシンではないことです。したがって、コンパイルするマシンの PAGE_SIZE が 2^14K で、宛先マシンが 2^16K の場合、ドライバーは失敗します。

この質問を、モジュールを実行していないマシンでモジュールをコンパイルすることに関する「ベストプラクティス」の問題に変えたくありません。私はそれについての問題を理解しています。私が見つけたのは、ほとんどの人が getpagesize() または sysconf(_SC_PAGE_SIZE) を使用していることです。これらの 2 つのオプションは ia64 カーネル ヘッダーに含まれていないため、使用できません。実行時の PAGE_SIZE を取得する別の方法はありますか?

私が見ているオプション:

  • /proc 内のファイルを読み込んでいますか?
  • システムコール?
  • 推論によって PAGE_SIZE を計算できる他の関数 (ORDER、getpageshift など)?
  • 他の?
0 投票する
1 に答える
3060 参照

linux - Linux sk_buffでは、skb-> dataは物理アドレスですか、それとも仮想アドレスですか?

組み込みシステム用のイーサネットドライバのメモリ破損の問題を調査しています。

バスマスタリングDMAコントローラと低速SDRAMの間に問題があるのではないかと思います。そのため、高速SRAMでバウンスバッファを使用したいと思います。これを行うには、2つのことが必要です。SRAMの物理アドレス(バスマスターの観点から)をDMAコントローラーバッファー記述子に配置する必要があります。DMAコントローラーが報告したら、バウンスバッファーからSDRAMのsk_buffにデータをmemcpyする必要があります。着信パケット。

読んでから私が判断できなかったこと

skb->dataが物理アドレスか仮想アドレスかです。つまり、私は呼び出す必要があります

また

パケットをsk_buffに入れて、残りのLinuxネットワークスタックがそれを処理できるようにしますか?

編集:これは問題のドライバーです。仮想アドレスをDMAコントローラーレジスタに渡しているため、機能しないと思いますが、このコードが機能する開発キットがあります。ただし、私のSDRAMはdevkit DDR SDRAMほど良いタイミングではないので、バウンスバッファを実装することを考えています。

0 投票する
4 に答える
17153 参照

hardware - ダイレクトメモリアクセスDMA-どのように機能しますか?

DMAが利用可能な場合、プロセッサはディスクブロックの長い読み取りまたは書き込み要求をDMAにルーティングし、他の作業に集中できることを読みました。ただし、この転送中は、メモリデータ/制御チャネルへのDMAがビジーです。この間にプロセッサは他に何ができますか?