1

Linuxに関する質問です(ドライバ関連)。大規模な DMA アクセスを実行できるハードウェアがあるとします (マルチメガバイトの読み取りまたは書き込み。CUDA カードまたはネットワーク カードを思い浮かべるかもしれません)。デバイスとの間で転送されるデータは、ユーザー空間に割り当てられ、ユーザー空間に配置されます。

mlock()ということで、DMAでアクセスするメモリ範囲が正しいと思います。次に、ユーザー プロセスがドライバーを呼び出して DMA 転送を開始します。転送が開始された後、私のユーザー空間プロセスはまだ他のスレッドで動作しています。

しばらくして、データが転送されたと思われるときに、munlock()ユーザー空間スレッドからメモリ範囲を実行したいと思います。

それは合法ですか?munlock()実際の DMA 転送が終了する前に呼び出したらどうなりますか?

これはmunlock()成功するか失敗するか?それとも、DMA 転送が完了するまでブロックしますか?

PS:質問はSO の id13422、Zan Lynx からのものです。

4

1 に答える 1

1

DMA に使用されるすべてのメモリをロックし、ロックされた状態を維持するのは、デバイス ドライバの役割です。

メモリが既にロックされている場合でも、ドライバーはページへの追加の参照を取得して、ロックが早く解除されないようにする必要があります。

于 2013-09-22T14:57:57.340 に答える