c - VirtualBox 如何处理 guest Linux 的中断?

标签 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 之后, guest Linux 就死了,因为它不再接收任何键盘。

你有什么想法吗?谢谢!

最佳答案

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

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

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

关于c - VirtualBox 如何处理 guest Linux 的中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12431220/

相关文章:

c++ - SHDeleteKey 和 RegDeleteTree 有什么区别?

linux - 为什么我无法在 NASM 程序集中打印用户输入的数据?

iphone - 如何在不触摸 UISearchbar 的情况下显示键盘?

ios - 有没有办法在 UIKeyboardType.NumberPad 的左下角区域添加一个字母?

c - 在openGL程序中实现太阳能系统中的方向键

c - 如何在c中正确解析字符串

c - C 中的表达式求值

linux - 如何从主脚本中的下标获取退出代码 - bash

python - 在没有提示的情况下从 python-fabric 重置 mysql root 密码

iphone - 从键盘处理 del 键