Linux kernel 编写基本键盘中断处理程序,抛出;“未知密钥已释放”;

Linux kernel 编写基本键盘中断处理程序,抛出;“未知密钥已释放”;,linux-kernel,Linux Kernel,我已经编写了一个基本的键盘中断处理程序。它使用共享中断,并用于将按下的键打印到/var/log/消息。但是,当我尝试使用箭头键时,会出现以下错误,其余的键都可以正常工作 8月19日18:59:06 vim内核:[112.485102]atkbd serio0:未知密钥已释放(已翻译的集合2,ISA00060/serio0上的代码0xe0)。 8月19日18:59:06 vim内核:[112.485108]atkbd系列0:使用“setkeycodes e060”来公开它。 粘贴代码 #inclu

我已经编写了一个基本的键盘中断处理程序。它使用共享中断,并用于将按下的键打印到/var/log/消息。但是,当我尝试使用箭头键时,会出现以下错误,其余的键都可以正常工作

8月19日18:59:06 vim内核:[112.485102]atkbd serio0:未知密钥已释放(已翻译的集合2,ISA00060/serio0上的代码0xe0)。 8月19日18:59:06 vim内核:[112.485108]atkbd系列0:使用“setkeycodes e060”来公开它。

粘贴代码

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <asm/io.h>

/* This function services keyboard interrupts */
irq_handler_t irq_handler (int irq, void *dev_id, struct pt_regs *regs) {
  static unsigned char scancode;

  /*
    Read keyboard status
  */
  scancode = inb (0x60);

  if ((scancode == 0x01) || (scancode == 0x81))
    {
      printk ("You pressed Esc !\n");
    }
  }

  return (irq_handler_t) IRQ_HANDLED;
}

/* Initialize the module and Register the IRQ handler */
static int __init keybrd_int_register(void)
{
  int result;
  /* Request IRQ 1, the keyboard IRQ */    
  result = request_irq (1, (irq_handler_t) irq_handler, IRQF_SHARED, "keyboard_stats_irq", (void *)(irq_handler));

  if (result)
    printk(KERN_INFO "can't get shared interrupt for keyboard\n");

  return result;
}

/* Remove the interrupt handler */
static void __exit keybrd_int_unregister(void) {
  free_irq(1, (void *)(irq_handler)); /* i can't pass NULL, this is a shared interrupt handler! */
}

MODULE_LICENSE ("GPL");
module_init(keybrd_int_register);
module_exit(keybrd_int_unregister);
#包括
#包括
#包括
#包括
/*此功能服务于键盘中断*/
irq_处理程序\u t irq_处理程序(int irq,void*dev_id,struct pt_regs*regs){
静态无符号字符扫描码;
/*
读取键盘状态
*/
扫描码=inb(0x60);
如果((扫描代码==0x01)| |(扫描代码==0x81))
{
printk(“您按下了Esc!\n”);
}
}
返回(irq_处理程序)已处理的irq_;
}
/*初始化模块并注册IRQ处理程序*/
静态整数初始化键BRD整数寄存器(无效)
{
int结果;
/*请求IRQ 1,键盘IRQ*/
结果=请求irq(1,(irq处理程序)irq处理程序,IRQF共享,“键盘统计数据irq”,(void*)(irq处理程序));
如果(结果)
printk(KERN_INFO“无法获取键盘的共享中断”\n);
返回结果;
}
/*删除中断处理程序*/
静态无效\uuu退出键brd\u int\u注销(无效){
free_irq(1,(void*)(irq_handler));/*我不能传递NULL,这是一个共享中断处理程序*/
}
模块许可证(“GPL”);
模块初始化(keybrd int寄存器);
模块退出(按键退出);
有人能告诉我为什么当我插入我的模块并开始工作时,当我移除这些箭头键时,这些箭头键停止工作吗


我正在虚拟机上运行代码。

原因是虚拟机出了问题。它在基本linux主机上运行良好。您可以看到完整的代码实现(naive)@

我正在考虑编写一些代码,以便临时重新映射键盘键,您认为我可以使用这些中断处理程序吗?我的问题是: