1

データを生成する Linux カーネル モジュールがあり、そのデータをユーザー空間アプリケーションに送信したいと考えています。どのようなオプションがあり、どのような長所と短所がありますか?

データは、たとえば、1 秒あたり数個の char[] と数個の int[] の 100 個の構造体である可能性があります。

また、可能であれば (必須ではありません)、これらの構造体が LKM で生成されるのと同じ順序でユーザーランドに到達することを望みます。

4

2 に答える 2

1

キャラクター ドライバーを作成し、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 関数はスリープでき、モジュールの他の部分はスリープできない可能性があることにも注意してください。ただのメモ

于 2013-04-26T07:43:50.713 に答える