2017-01-27 47 views
3

初心者からLinuxへのカーネルとドライバの開発ここでは、割り込みハンドラのカーネルバッファからユーザ空間バッファへのデータの移動

私は、pcieデバイスから割り込みが入ってくるデータを持っています。割り込みが検出されるたびに、私はドライバが(ドライバにある)バッファからユーザー空間の大きなバッファにデータをコピーするようにします。ユーザーアプリケーションは、ドライバーに新しいデータを "ポーリング"しません。

現在、私の割り込みハンドラは、ユーザ空間のデータをcopy_to_user()にしようとします。これは失敗します。 copy_to_user()は常にnを返します。nはコピーしたいバイト数です。私の推測は、割り込みハンドラの呼び出しは、コピーを失敗させるコンテキストの切り替えを引き起こすのですか?

これを達成するにはどうすればよいですか?

ありがとうございます!

+0

アプリがポーリングしない場合、新しいデータがいつバッファに表示されるかはどのようにわかりますか?運転手が信号を送信しますか? – Barmar

+0

@Barmarユーザアプリケーションは、デバイスがすでにホストにデータを送信したことを通知するpcieデバイス内のレジスタを読み取ります。 – whyamihere

+0

広すぎます。私たちはコンサルティングサイトではありませんが、**具体的な**質問はあなたのコードを示して、何/何故動作していないのかを指摘してください..脇役として:オプション(例えばFPGA)があれば、データをバッファにコピーします。 – Olaf

答えて

3

copy_to_user()は、プロセスによって異なるアドレススペースがあるため、ユーザースペースプロセスのコンテキストで実行する必要があります。さらに、メモリがスワップアウトされた場合は、copy_to_user()を再度読み込む必要があります。この場合、ファイルI/Oとスリープが必要です。これは割り込みハンドラ内では実行できません。

一般に、割り込みハンドラで使用するバッファは、ドライバ自体で制御(割り当て)する必要があります。そのバッファにユーザ空間プログラムのアクセスを与えたい場合は、mmap()を実装してください。

実際には、通常、DMAバッファから大きなバッファにデータをコピーするのはアプリケーションの仕事です。

+0

あなたの最後のコメントに関して: "...これは通常、DMAバッファから大きなバッファにデータをコピーするアプリケーションの仕事です。"割り込みハンドラを使用して、新しいデータが到着してコピーする必要があることをユーザに知らせる必要がありますか? netlinkのようなものを介して言う? – whyamihere

+0

アプリケーションがDMAバッファにアクセスするか、より大きなバッファにアクセスするかにかかわらず、同じメカニズムを使用する必要があります。 –

関連する問題