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

驱动程序不应也不能取消注册本身未注册的中断处理程序。为了防止原始驱动程序处理键盘中断,您可以执行以下操作:

1)在你的中断处理程序中返回IRQ_HANDLED:这个值表示中断处理得很好,linux内核的中断处理机制将停止调用下一个中断处理程序。或者

2)清除硬件中的输入缓冲区,您可以参考原始键盘驱动程序的代码来了解键盘击中事件期间使用的状态寄存器和输入缓冲区。

于 2012-10-16T03:04:40.720 回答