2016-11-22 8 views
2

Linuxのmisc_deviceドライバを作成していますが、読み込みに問題があります。現在、カーネルはドライバを高速デバイスと見なしています。ドライバの読み込みは、(ディスクからファイルを読み込むときのように)ユーザスペースの呼び出し元が必要とするデータが使用可能になるまでバッファリングされます。つまり、バッファがいっぱいになるまで、readシステムコールは返されません。私はその動作を変更し、カーネルに(ソケット上の読み込みのように)いくつかのデータが利用可能になるとすぐにシステムコールを返すように指示します。バッファなしmisc_device - Linuxカーネルドライバを読み込みます

可能ですか?どうやって?私はそれを完全に間違っているのですか?

ありがとうございます!

+0

あなたは9週間後、まだこの質問に興味があるなら知っているが、しないでください:あなたはブロッキングがカーネル内で起こっていることを確信していますか?私の思い出は、構造ファイルf_flagsのO_NONBLOCKをチェックし、必要に応じて入力待ちをブロックするのはドライバの仕事であるということです。それ以外の場合、O_NONBLOCKが設定されていない場合は、各読み込み呼び出しでできるだけ多くのデータを読み込んで一度に返す必要があります。読み込み呼び出しが最後に発生した場合は、データを読み込まずに0バイトを返して呼び出し元に停止します。 O_NONBLOCKを設定するかどうかは、もちろんユーザスペースの仕事です。 – michaeljt

答えて

0

あなたは私のコメントに答えなかったので、通常、十分なデータが利用できるようになるまで待っているのは、一般的なカーネルコードではなく、ドライバーが一般的なカーネルコードではなく、これを行うコード[1]。待機する必要があるかどうかを知るには、struct file f_flagsのメンバーであるO_NONBLOCKをチェックする必要があります。しかし、ユーザ空間は、read()が0バイトの読み込みを返して返るまでループ内でread()を呼び出し続けることがあります。したがって、最後の呼び出し以降に読み込みを呼び出して新しいデータが到着しなかった場合は、バイトを0に設定することが重要です。希望が役立ちます。

[1] http://www.makelinux.net/ldd3/chp-6-sect-2

関連する問題