2

私はVirtualBoxゲストLinuxで簡単なキーボードドライバーを書く練習をしています。問題は、私のコードが割り込みハンドラーを登録scancodeしてログファイルに出力するだけだということです。そして、私はそれらの着信スキャンコードをのような上位レベルのコードに送信しませんLinux input core。後insmod、を使用してキャプチャされたスキャンコードを確認できますdmesg。しかし、なぜ私の端末はまだ正しい入力を取得するのですか?端末が受信するものはありません。

私のコードは次のようになります:

static int __init init_simple_keyboard_driver(void)
{
    free_irq (IRQ_1, NULL);
    return request_irq (IRQ_1, my_handler, ...);
}

static irqreturn_t my_handler(int irq, void *dev_id)
{
    unsigned char scancode = get_scancode_from_port_0x60();
    printk(...scancode...);
}

insmod、カーネルログにメッセージが表示されます。

  1. 私のfree_irq呼び出しはのようないくつかのメッセージを引き起こしますCan't free already freed IRQ。(理由はわかりません...すでに解放されるべきではありません。)
  2. atkbd運転手は、代わりに誰かが処理するように頼む人がいると不平を言いIRQ_1ます。
  3. これらのスキャンコードは正しく印刷できます。
  4. [最も奇妙なもの]アクティブなコンソールはまだ正しいキーボード入力を取得します。したがって、rmmodこの単純なドライバーを使用して実行することができます。
  5. その後rmmod、ゲストLinuxはキーボードを受信できなくなったため、死んでしまいました。

何か考えはありますか?ありがとうございました!

4

1 に答える 1

1

ドライバーは、それ自体で登録されていない割り込みハンドラーを登録解除すべきではなく、登録解除できませんでした。元のドライバーがキーボード割り込みを処理するのを防ぐために、ether を実行できます。

1) 割り込みハンドラーで IRQ_HANDLED を返します。この値は、割り込みが適切に処理され、Linux カーネルの割り込み処理メカニズムが次の割り込みハンドラーの呼び出しを停止することを示します。または

2) ハードウェアの入力バッファをクリアします。元のキーボード ドライバのコードを参照して、キーボード ヒット イベント中に使用されるステータス レジスタと入力バッファを知ることができます。

于 2012-10-16T03:04:40.720 に答える