【问题标题】:How does VirtualBox handle interrupt for the guest Linux?VirtualBox 如何处理来宾 Linux 的中断?
【发布时间】:2012-09-08 00:20:30
【问题描述】:

我正在练习在 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 就死了,因为它不能再接收任何键盘了。

你有什么想法吗?谢谢!

【问题讨论】:

  • 那么,您正在尝试编写一个驱动程序来管理已经由现有驱动程序管理的硬件(而不是连接第二个键盘供驱动程序使用)?我认为这可能不太可行......
  • @twalberg 感谢您的评论。是的,我正在编写一个驱动程序来替换原来的驱动程序。那不可能吗?你能告诉我这样做的正确方法吗?只在开机时加载?
  • @twalberg 而且,我刚刚在cat /proc/interrupts 上看到了my_handlerIRQ 1 上的原始i8042。我认为这意味着我未能释放原始中断。
  • 这不是不可能的,但是,除非您有办法可靠地使原始驱动程序停止管理设备,以便您可以加载模块来测试它,否则您将继续遇到诸如您在上面所说的结果是由两个驱动程序管理同一设备造成的。因此,第二个键盘是一种可能,或者是第二台计算机,这样您就可以远程登录以进行测试...
  • @twalberg 非常感谢!我会用谷歌搜索更多关于如何禁用原始版本的信息。

标签: c linux keyboard kernel driver


【解决方案1】:

驱动程序不应该也不能取消注册本身未注册的中断处理程序。 为了防止原驱动处理键盘中断,可以做ether:

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

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

【讨论】:

    猜你喜欢
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    相关资源
    最近更新 更多