You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同版本内核Ubuntu主机/虚拟机键盘中断处理程序不触发问题

可能的核心诱因

两个环境的本质差异是:VirtualBox默认模拟传统PS/2键盘控制器(i8042),走legacy IRQ1中断路由,而物理机基本不会沿用这套几十年前的中断分配逻辑,硬编码IRQ号为1的写法本身就没有跨硬件可移植性。

  • 物理机键盘根本没有绑定到IRQ1中断线
    你观察到物理机未加载模块时/proc/interrupts里完全没有1号中断的i8042表项,这就是最直接的证据:当前系统没有任何设备往1号IO-APIC中断线发事件。现代物理机键盘的中断路由一般分两种情况:
    • 外接USB键盘、内置笔记本键盘走USB HID协议时,中断是挂在USB xHCI/EHCI控制器对应的IRQ线上,IRQ号是动态分配的,和固定的1号完全没关系
    • 少数保留PS/2兼容支持的物理机,也可能因为内核irqdomain动态映射、IOMMU/APIC中断重映射,把i8042的中断映射到其他非1的IRQ编号,不会硬编码固定为1
  • 物理机固件层禁用了PS/2控制器
    现在绝大多数消费级、服务器级主板的UEFI/BIOS默认会关闭legacy PS/2控制器兼容支持,这种情况下内核根本不会加载i8042驱动,IRQ1线完全处于无设备触发的状态,你就算注册了中断处理函数,没有硬件中断信号输入,处理函数永远不会被调用。
  • 你在物理机加载模块后看到的/proc/interrupts里1号中断的计数始终为0,也印证了这条线根本没有中断信号上来,不是中断处理函数逻辑写错了,是这条线上根本没有你要等的键盘事件。
排查验证方法
  • 先定位物理机键盘实际对应的IRQ号:执行cat /proc/interrupts | grep -E 'i8042|hid|usb',按几次键盘看哪个IRQ对应的中断计数同步上涨,那个才是键盘实际使用的真实IRQ号,不要硬编码写1。
  • 检查i8042驱动是否加载:执行lsmod | grep i8042,如果没有任何输出,说明系统根本没初始化PS/2控制器,注册IRQ1完全是无效操作。
  • 不要用直接注册硬编码IRQ的方式监听键盘事件:这是典型的写demo时在虚拟机里跑通就误以为通用的错误写法,Linux内核里做键盘事件监听的标准可移植方式是注册input子系统的通知链,或者绑定对应input设备的事件回调,直接操作legacy IRQ的方式在不同硬件拓扑下完全不具备兼容性。

你贴的request_irq调用本身参数没有问题:

request_irq(IRQ_NUMBER, keyb_handler, IRQF_SHARED, "irq_keyboard",
                        (void *)keyb_handler);

问题出在你传入的IRQ_NUMBER在物理机上根本不对应键盘的实际中断线。

内容的提问来源于stack exchange,提问作者Talita Rushel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:24:21