VirtualBox如何处理来宾Linux的中断?

时间:2012-09-14 20:02:33

标签: c linux keyboard kernel driver

我正在练习在VirtualBox guest 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已经死了,因为它再也无法接收任何键盘了。
  6. 你知道吗?谢谢!

1 个答案:

答案 0 :(得分:1)

驱动程序不应该也不能取消注册未自行注册的中断处理程序。 为防止原始驱动程序处理键盘中断,您可以执行ether:

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

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