データを生成する Linux カーネル モジュールがあり、そのデータをユーザー空間アプリケーションに送信したいと考えています。どのようなオプションがあり、どのような長所と短所がありますか?
データは、たとえば、1 秒あたり数個の char[] と数個の int[] の 100 個の構造体である可能性があります。
また、可能であれば (必須ではありません)、これらの構造体が LKM で生成されるのと同じ順序でユーザーランドに到達することを望みます。
データを生成する Linux カーネル モジュールがあり、そのデータをユーザー空間アプリケーションに送信したいと考えています。どのようなオプションがあり、どのような長所と短所がありますか?
データは、たとえば、1 秒あたり数個の char[] と数個の int[] の 100 個の構造体である可能性があります。
また、可能であれば (必須ではありません)、これらの構造体が LKM で生成されるのと同じ順序でユーザーランドに到達することを望みます。
キャラクター ドライバーを作成し、read 関数を使用してこれを返します。断然、これに関する最高のチュートリアルはLDD3 (Linux Device Drivers, Third Edition)にあります。無料でダウンロードできます!したがって、構造体 file_operations に入力し、これらのフィールドに入力します。
static const struct file_operations my_fops = {
.owner = THIS_MODULE,
.read = my_read,
.open = my_open,
.release = my_release,
};
その子犬を cdev_init() などに渡します。それで、(my_read() で) データを吐き出します。
編集: そうそう、私はこれの物理的な本を所有しています。
EDIT2: ああ、それで、長所と短所が必要ですか? :) キャラクタードライバの最大の利点は、Torvolds からシステムコール番号を取得する必要がないことです。:) 繰り返しになりますが、パッチを配布しようとしていないのであれば、そうする必要はありません。キャラクター ドライバーは非常に単純で、実装も簡単です。ユーザーランド アプリがさまざまなデータを要求し、そのデータが要求された場合にのみ返されるようにする場合は、ioctl を使用することもできます。または、ユーザーランド アプリにリクエストを書き込んで、リクエストを受け取ったときにのみ読み取り関数からデータを受け取るようにすることもできますが、一定のデータ スピューが必要なだけだと思います。その場合、読み取り関数に、モジュールのどの部分から取得したものでも、取得したとおりに、送信したい順序で (ユーザーランドに) 書き込みます。
非常に大量のデータを扱っていてボトルネックが発生している場合は、mmaped メモリを介してユーザー空間アプリに書き込むことを検討してください。しかし、正直なところ、私はその特定の分野で優れた専門知識を持っていません。
そうそう、あなたの struct file_operations 関数はスリープでき、モジュールの他の部分はスリープできない可能性があることにも注意してください。ただのメモ