0

私の目的は、カーネルからの多くのアクティビティをログに記録することです。このためには、ディスク ベースのファイル システムに書き込む必要があります。

そのため、キャラクターデバイスドライバーと、この仮想デバイスから読み取るユーザー空間プロセスを実装しました。ドライバーはデータをユーザー空間バッファーにコピーし、ユーザー プロセスはそれをファイルに書き込みます。

私の問題は、データを同期する方法です。fifo のカーネル実装で kfifo を使い始めました。そのため、ログを記録する場合は常に、kfifo API を使用してデータを fifo にコピーします。仮想デバイス ドライバーは fifo から読み取り、それをユーザー空間にコピーします。ログに記録されるデータは膨大であるため、プロデューサー コンシューマーなどで同期が必要です。Linux カーネルで使用できるサポートはありますか?

ネットリンクソケットはそのような問題を解決しますか??

4

3 に答える 3

0

リレー インターフェイスを使用することもできます。 を参照してくださいDocumentation/filesystems/relay.txt

于 2010-12-15T12:28:57.497 に答える
0

ログに記録するデータが多く、ログ データを見逃したくない場合は、単純なダブル バッファリングの原則を使用することもできます。

kfifoについてはわかりませんが、キャラクターデバイスドライバーの読み取り呼び出しで、デバイスから読み取るデータがない場合、ユーザー空間プロセスをスリープ状態にすることができます。また、カーネルがキャラクター デバイスに書き込むときはいつでも、デバイス上でスリープ状態にあるプロセスを起動できます。例えば

In kernel
 struct logbufStruct {
   char *kbuf; //by kmalloc or any means you wish.
   int ptr; //ptr to next writeable byte in kbuf.
   size_t kbuf_size;
   unsigned int flags;
   wait_queue_head_t data_wait;
 }
 read(inode, filep, buf, size) {
  logbufStruct = filep->private_data
  if (!test_bit(HAS_DATA, &logbufstruct.flags))
    wait_event_interruptible(&logbufstruct->data_wait, 
           test_bit(HAS_DATA, &logbufstruct.flags)||
           test_bit(ERROR, &logbufstruct.flags));
  /*
   * When this call returns, you would either have woken up
   * on data available or some signal interrupt which you should
   * handle in your character device and set appropriate flags.
   */
    if (test_bit(ERROR, &logbufstruct.flags) return -1;
    numbytes = copy_data(logbufStruct, buf, size);
    if(!has_more_data(logbufstruct)) clear_bit(HAS_DATA, &logbufstruct.flags);
    return numbytes;
 }

 /* This is the function your modules would call to log data
  * to be sent to userspace.
  */
 int mylogger_log(logbufstruct, char *msg, size_t n)
 {
   if (logbufstruct->ptr + n > logbufstruct->kbuf_size)
      return -1;
   copy the data.
   wake_up_interruptible(&logbufstruct->data_wait);
 }
 //initialization
  init_waitqueue_head(&logbufstruct->data_wait);
  logbufstruct->kbuf = kmalloc or whatever way you have to allocate
   space for holding log messages in memory.
于 2010-12-16T19:30:41.483 に答える
0

char デバイスよりも netlink ソケットの方が目的にかなうと思います。カーネルは書き込みが必要なときはいつでもソケットに書き込み、このソケットで待機するユーザープログラムはソケットから読み取り、ファイルに書き込みます。

また、情報を取得するためにカーネルから何かをログに記録しようとしているだけで、モジュールを作成したり、本番環境で使用するために Linux カーネルに変更を加えたりしていない場合は、カーネル内からファイルを開いたり書き込んだりする方が簡単で高速です (開発時と同様)。

于 2010-12-15T15:48:19.673 に答える