我正在练习在 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
之后,我可以在内核日志中看到消息。
- 我的
free_irq
调用导致一些消息,例如Can't free already freed IRQ
。 (我不知道为什么......它不应该被释放。) atkbd
驱动程序提示有人要求处理IRQ_1
。- 这些扫描码可以正确打印。
- [最奇怪的] 事件控制台仍然获得正确的键盘输入。因此,我可以使用这个简单的驱动程序执行
rmmod
。 - 在
rmmod
之后, guest Linux 就死了,因为它不再接收任何键盘。
你有什么想法吗?谢谢!
最佳答案
驱动程序不应该也不能取消注册自己未注册的中断处理程序。 为了防止原始驱动程序处理键盘中断,您可以这样做:
1) 在你的中断处理程序中返回 IRQ_HANDLED:这个值表示中断处理得很好,linux 内核的中断处理机制将停止调用下一个中断处理程序。或者
2) 在硬件中清除输入缓冲区,可以引用原始键盘驱动程序的代码来了解在键盘点击事件期间使用的状态寄存器和输入缓冲区。
关于c - VirtualBox 如何处理 guest Linux 的中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12431220/