为 Linux 或 Windows 查找 table 个中断?

Find table of interrupts for Linux or Windows?

我最近开始学习 asm,遇到了一个问题,我无法找到 linux 或 win 的所有中断的 table。我查看了英特尔文档,但没有找到此信息。那么,你如何找到所有中断的table?

一般来说,如果没有真正的硬件启动,你无法找到“table of all interrupts”,因为它取决于很多因素,包括扩展适配器集、确切的芯片组版本、处理器版本等。

我会假设 x86 作为上下文。 Intel 定义前 32 个中断向量 (0-31) 供 CPU 本身使用 - 它可以在内部定义的异常上生成它们的调用。这会与将中断分配给 8-15 的旧样式(从各种 IBM PC 描述中得知)发生冲突,但是,它被定义为 OS 任务以在进入保护模式时重新分配所有冲突的中断。然后,中断控制器(现在,您可以假设它们至少是 APIC)被编程为将保持设置的中断号分配给需要它们的硬件。可分配哪些号码,取决于巴士类型和交付方式:

  • MSI(消息信号中断),MSI-X - PCI-E 的主要技术 - 由 APIC 编程分配,通常每个设备和角色一个编号(一些设备会发出多种中断类型);
  • 旧的基于线的样式(经典 PCI)- 每条总线最多 4 条中断线;因此数字之间可能会发生冲突,处理程序应迭代所有可能的设备。在Pentium 1-3时代的经典设计中,它们被BIOS分配到范围10-14,然后被OS移动到一些更高的范围。

在我写这篇文章的系统中,分配给硬件的中断号是 36-62,有一些差距。 xhci_hcd.

使用了其中的 17 个

总结一下:对于 CPU 中断,请阅读 CPU 文档。对于其他人,假设动态分配并使用各自的 API.

在 OS 状态下找到当前分配

所以,我为 windows 编写代码并认为 linux 有 table 或带有中断的列表。但是当我了解到 linux 只有一个中断(int 80h)和许多系统调用时,我感到很惊讶。所以,我可以在这里查看系统调用

https://man7.org/linux/man-pages/man2/syscalls.2.html

https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md

还按 OS(x32 或 x64)的处理器类型和体系结构进行系统调用。所以,我应该使用系统调用并且只有一个中断 - int 80h。 我明白了这一点,现在我想帮助别人