1

自分の制御外に割り当てられたメモリ バッファの DMA マッピングをセットアップしたいと考えています。dma_map_single は使用するのに適した API のように見えますが、私の HW には制限があり、マッピングが 2 のべき乗の境界を越えてはならない、たとえば 1K などがあります。マップされるバッファーのサイズは、常に境界値より小さくなりますが、それ以外は可変です。そのため、「割り当て」の部分は私が必要としているものですが、固定サイズが必要なため、DMA プールが機能しない可能性があります。

dma_map_single を実行し続けて、マッピングが要件を満たしているかどうかを確認し、そうでない場合はマッピングをリリースする必要がありますか? これにより、同じマッピングが返される可能性があり、終わりのない検索が発生する可能性がありますか? もしそうなら、適合するものが見つかるまで適合しないマッピングに固執し、適合しないすべてのマッピングを一度に解放することができます。ただし、これらは良いアイデアとは思えません。

他の/より良いアイデアを持っている人はいますか?

ありがとう。

4

1 に答える 1

2

渡されたバッファーが基準を満たしていることを保証できない場合は、DMAを実行する前に、補助バッファーを割り当て、そのバッファーとの間でコピーする必要があります。IOMMUまたはその他のアドレス変換ハードウェア(クラシックx86、ARMなど)を備えていないプラットフォームでは、DMAマッピング操作は実際には物理アドレスに変換するだけです。したがって、マップを解除して同じバッファで再試行すると、常に同じDMAアドレスが返されます。

IOMMUを備えた他のほとんどの(すべて?)プラットフォームでは、変換は引き続きチャンク>=PAGE_SIZEで実行されます。つまり、4Kページのプラットフォームを使用していて、0xABCDExxxのバッファでDMAマッピングを行う場合、アドレス「xxx」の下位部分が同じままである0xFGHIJxxxのようなDMAアドレスを常に取得します。(これは、IOMMUが通常のMMUのように機能し、ページ変換のみを検索し、下位12ビットまたはその他のビットをそのままにしておくためです)

したがって、基本的にすべてのプラットフォームのすべてのケースで、DMA APIを使用して、渡されるバッファーの配置を修正することはできません。私が言ったように、渡されるバッファーがアライメント要件を満たさない場合の唯一の選択肢は、バウンスバッファーを使用することだと思います。DMAプールAPIは、これらのバウンスバッファーを割り当てるための優れた方法です。より小さなバッファーが必要な場合でも、問題はありません。取得したメモリの一部を未使用のままにしておくことは問題ありません。

于 2012-09-07T22:35:05.517 に答える