在QEMU中启用MSI后中断处理器未触发,求排查方案
自制OS中xHCI MSI中断无法触发的问题排查
背景
我正在跟随日文版《ゼロからのOS自作入門》开发自制OS,参考该书配套源码实现(但我用Rust替代C++,部分细节有差异)。目前已完成USB键鼠的xHCI驱动,主程序通过无限轮询事件环前端捕获设备事件TRBs。下一步计划在PCI接口启用MSI中断以替代轮询机制,在QEMU中使用-device nec-usb-xhci选项(因-device qemu-xhci仅支持MSI-X,不支持MSI)。我严格按照书籍说明操作:向PCI配置空间写入对应数据、添加处理队列事件的中断处理器、加载IDT,但中断处理器始终未执行。
调试尝试与结果
我通过QEMU的-trace "pci_cfg_write"选项检查PCI配置空间的写入操作,得到以下输出:
pci_cfg_write nec-usb-xhci 04:0 @0x70 <- 0x890005 pci_cfg_write nec-usb-xhci 04:0 @0x74 <- 0xfee00000 pci_cfg_write nec-usb-xhci 04:0 @0x78 <- 0x0 pci_cfg_write nec-usb-xhci 04:0 @0x7c <- 0xc040
其中0x40是我选择的xHCI中断向量,同一时间仅接受一个中断。上述写入操作与书中的C++实现完全一致,但书中的实现能成功启用MSI,我的却不行。
另外,我尝试在主循环中插入int 0x40手动触发该中断,此时鼠标可正常移动,说明IDT配置正确、事件处理逻辑正常,仅MSI未自动触发中断。
问题
- 可能导致该差异的原因是什么?
- 如何正确激活MSI中断?
内容的提问来源于stack exchange,提问作者Paul Sohn
相关产品推荐
相关产品推荐

