3

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

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

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

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

4

1 に答える 1

2

はい、待つ必要がありますが、:

PCI デバイスの予期せぬ削除動作をテストしようとしている場合を除き、デバイスとの間で DMA が実行されている場合、remove() の呼び出しは失敗するはずです。また、close() を remove() と同じように扱うことはできないと思います。後者は、すべてのデバイス関連のデータ構造をメモリから完全に削除します (たとえば、ネットワーク デバイス ドライバの 1 つを参照してください)。言い換えれば、私が言おうとしているのは、close() では wait()、remove() では fail() ということです。

また、状況によっては、デバイス関連のリソースを解放するために参照カウントを確認することもできます。

于 2010-05-12T13:17:39.547 に答える