0

ユーザー空間プログラムがタイマーを設定するために使用するカーネルモジュールを構築しようとしています。キャラクターデバイスとして実装しています。カーネルモジュールに複数のタイマーを実装する最良の方法は何ですか?

現在、'timer_list*'、sat 'timer' が 1 つあります。タイマーの新しいリクエストを取得するたびにヒープからメモリを割り当ててから、メモリを割り当てるたびに setup_timer() と mod_timer() を使用してタイマーを設定します。しかし、私は timer_list 構造体へのポインターを 1 つしか使用していません。しかし、ここでの私の懸念は、「タイマー」の現在の値がコールバック関数が呼び出される構造を指していない可能性があるため、コールバック関数が呼び出されたときに「タイマー」に割り当てられたメモリを解放する方法です。

そこで、構造体のアドレスを引数としてコールバック関数に渡し、そのアドレスで kfree() を呼び出すことを考えました。

struct timer_list *timer;
timer = kmalloc(sizeof(struct timer_list), GFP_KERNEL);
setup_timer(timer, my_callback, (unsigend long)timer);

私のコールバック関数は次のようになります。

void my_callback (unsigned long data)
{
      struct timer_list *timer = (struct timer_list*)data;
      printk("%d\n", timer->data);
      kfree(timer);
}

この場合、timer->data を印刷しようとすると、その特定のアドレスのページがないと言ってセグメンテーション違反が発生します。つまり、コールバック関数が呼び出されると、timer_list に割り当てられたメモリが解放されます。その場合、メモリの解放について心配する必要はありません。

また、このことを実装するためのより良い方法はありますか。また、すべてのタイマーを追跡するために (タイマーの存在のようなチェックなど)、リンクされたリストのようなものを維持することは避けられますか、またはこれをチェックするためのカーネル関数がありますか?

4

1 に答える 1

1

何らかの方法で、すべてのタイマーを追跡する必要があります。たとえば、保留中のタイマーlist( l​​ist.hを参照) を使用できます。次に、リストをループして、タイマーがすでに期限切れになっているかどうかを確認し、そのメモリを解放します (そしてリストから削除します)。これは、新しいタイマーを割り当てる前に行うことができます。

timer_listで再プログラムできるため、自動的に解放されませんmod_timer()

于 2013-10-10T07:59:39.907 に答える