我对Linux内核模块开发非常陌生,并试图编写一个简单的内核模块,以后可以作为键盘驱动程序进行扩展。
我尝试了两种方法:
我按照here指南开始编写代码。但唯一的问题是当我运行rmmod
时机器冻结,因为它无法将IRQ恢复到原始键盘驱动程序。
有没有办法保存device name
&在device id
中请求IRQ之前原始键盘驱动程序的init()
,然后在exit()
即cleanup_module()
被解雇后将所有内容恢复正常?
void cleanup_module() {
/* Something to restore everything back to normal */
free_irq(1, NULL);
}
在这种方法中,我不断轮询Key Pressed&通过使用while
循环释放,然后将输入复制回用户。
while(!(inb(0x64) & 0x1) || (input = inb(0x60)) & 0x80);
我面临的问题是它永远不会出现在while
循环中。我假设这是因为原始键盘驱动程序服务请求。
有没有办法从原始键盘驱动程序转发请求?
我感谢任何关于此的帮助/指示。
谢谢!
答案 0 :(得分:0)
我担心只要正常的内核键盘驱动程序也在控制键盘,我就不会看到它是如何工作的,因为两个驱动程序都会试图控制设备。内核i8042驱动程序(我假设它是相关的)将其中断注册为共享,如果您的驱动程序设法注册相同的中断,那么它也将其处理程序注册为共享,以便在中断时通知并将竞争访问该设备。
如果您注册了共享处理程序,这也可以解释卸载它时的崩溃:取消注册共享中断处理程序仅在第二个参数包含有效的dev_id时才有效。因此,当您使用NULL调用时,取消注册将失败,但处理程序代码仍将从内存中卸载。这将导致未来中断崩溃。
关于你的轮询方法,是的,因为正常的驱动程序会在中断时收到通知,所以很可能会让你不得不读到键盘。