1

Linuxカーネルモジュールプログラミング(割り込みハンドラー)を学習し、チュートリアル(http://tldp.org/LDP/lkmpg/2.6/html/)の正確なモジュールリンク(http://tldp.org/LDP/lkmpg/2.6 )を使用しています/html/x1256.html )。

チュートリアルで使用するとエラーが発生します

INIT_WORK(&task, got_char, &scancode);

エラーは「エラー: マクロ "INIT_WORK" は 3 つの引数を渡しましたが、2 つしか取りません」でした。

だから私は1つの解決策を見つけて、以下の行を使用します

INIT_WORK(&task, got_char);

正常に動作していますが、取得している出力は null です。キーボードからのキー番号を期待しています。

体は何か考えがありますか?

明確でない場合はお知らせください。さらに解釈を試みます。

ありがとう

4

1 に答える 1

4

次のような構造を追加します。

struct getchar_info {
    /* Other info ... */
    struct work_struct work;
    unsigned int scancode;
    /* Other info ... */
};
static struct getchar_info gci; /* Statically declare or use kmalloc() */

に変更got_char()し、

static void got_char(struct work_struct *work)
{
    struct getchar_info *info = container_of(work, struct getchar_info, work);
    info->scancode = my_val;
    /* ... */

のように初期化します。INIT_WORK(&gci.work, got_char);

これは、一般的なLinux カーネルパラダイムまたは設計パターンです。ワーク キューコードは、got_charルーチンに簡単に提供できるように、この構造体ポインターを管理する必要があります。ドライバーは、より大きな構造の一部としてそれを割り当てる必要があります (OO 用語での継承です。'C ' のみがサポートしているため、コンポジションのように見えます)。これcontainer_ofは C++ に似ています(C++ の専門家dynamic_cast<>が見ている場合に備えて、単一の継承があります)。サブ構造から構成された構造を取得できます。

于 2013-10-04T18:00:30.273 に答える