4

在英特尔软件开发人员手册中,它说中断向量 32-255 通常是用户为外部 IO 设备定义的。在我的系统编程课上,我必须开发一个简单的设备驱动程序。我的问题是如何定义用于特定设备的特定中断向量?这是通过 BIOS 完成的吗?

注意:我们正在开发一个简单的操作系统,所以我的情况非常具体,但是,最后我需要了解这一切在 x86 系统上是如何发生的。目前我们的系统设置为将 32 个以上的中断向量分配给串行端口和键盘等设备。在阅读英特尔 82801EB ICH5 IO 控制器的数据表时,特别是关于 8259 PIC 的部分,它说 IRQ15 是辅助 IDE 通道。最终将如何将其作为中断向量放入堆栈?

我可能只是很困惑,以至于这个问题没有意义,所以我提前道歉。

编辑:所以我们的系统编程类有一个非常简单的操作系统,它具有用于安装 ISR 的内核例程,以处理给定向量编号的特定中断。在上个季度的课堂上,教授给了我们一个头文件,将键盘定义为向量编号 0x2c 或类似的东西。我试图找出如何使用我们的内核例程将主要和/或次要 IDE 通道中断映射到各种 ISR。目前,所有未使用的中断向量都有一个默认处理程序,如果发生中断,它将打印消息,因此 IDE 中断目前甚至没有打开,但这是另一个问题。

4

6 回答 6

1

我已经有一段时间没有处理这些东西了,所以这可能是关闭的:我记得 PC 中断控制器有 15 条 IRQ 线。这些映射到特定的相邻 x86 中断向量。所以当一个外设触发一条 IRQ 线时,PIC 会中断 CPU 并告诉要跳转到哪个向量,就好像执行了相应的 INT 指令一样。一些 IRQ 被硬编码到某些外围设备,但我相信 PCI 设备与操作系统协商 IRQ 和一些其他资源(就像传统的 ISA PnP 设备一样)。

我不明白您的意思是“最终如何将其作为中断向量放入堆栈?”

于 2009-04-21T15:47:08.340 回答
1

您可以对 PIC(可编程中断控制器)进行编程以映射某些设备 IRQ。

在 x86 上,有两个 PIC 以菊花链形式提供 IRQ0-IRQ17。IRQ0-7 由 8259 管理,IRQ8-15 由第二个 8259 管理。第一个向 CPU 发出信号并且是主机,第二个(从机)向第一个发出信号。

IDT(中断描述符表)将中断映射到 ISR(中断服务程序)的地址。可以使用 INT 指令(软件陷阱)直接引发中断。

例如,要引发中断 0x80,请执行INT 0x80.

要处理 0x80 mov [0x80*4], int_80_handler,. 假设是 32 位架构,int_80_handler函数的地址现在存储在 IDT 中的第 0x80 位。

您会发现这些很有帮助:
http://en.wikipedia.org/wiki/Intel_8259
http://en.wikipedia.org/wiki/Interrupt_Handler
http://en.wikipedia.org/wiki/Interrupt
http://en .wikipedia.org/wiki/Interrupt_descriptor_table

于 2009-04-21T15:50:48.973 回答
1

设备获取中断有两种可能的方式:

  1. 使用即插即用或 Pci 机制。如果您这样做,BIOS 将调用您的外围设备并询问资源要求。之后您的驱动程序可以枚举即插即用设备,搜索支持的设备并从该设备获取硬件中断。

  2. 早期是如何做到的:只使用一个中断。向设备添加一个拨码开关,允许用户在不同的中断之间进行选择。资源分配现在掌握在用户手中。用户还将以某种方式在加载时将中断号传递给驱动程序。

现在如何挂钩中断:这取决于操作系统和 x86 运行的模式。对于裸机系统,您可以通过特殊指令查询 IDT(中断描述符表)。一旦你有了那个 IDT,你就可以获得地址并将 IRQ 处理程序的地址插入正确的插槽。对于实模式,我不知道它是如何完成的。

如果您至少有一点实时操作系统或类似操作系统的东西在运行,那么很可能已经有一个内核函数可以为您完成繁重的工作。

于 2009-04-21T15:53:41.227 回答
0

我记得在内存空间的开头有一个向量表,它指向发生特定中断时要调用的例程。我可能在这里的级别太低(旧的 x86 汇编程序员),但在基本级别,您将向量安装在该表中,然后调用您的例程。我没有任何旧的参考资料,所以不能给你实际的电话,但如果官方方法在 BIOS 之外运行,我会感到惊讶。

在 GUI 的这些日子里,我确信还有其他更合适的方法,允许中断共享和所有这些好东西。

编辑:忽略大部分,我刚刚看到您正在查看硬件中断之外的中断 16 及更高版本。在那个空间里有任何有趣的硬件之前,我就离开了那个级别的编程,所以我只处理过前 15 个 IRQ(第 16 个是控制器之间的级联)。我留下它以防其他人感兴趣:)

于 2009-04-21T15:39:23.897 回答
0

好吧,我似乎在我们的支持代码中找到了答案,特别是 PIC 初始化例程。使用以下代码,IRQ 行分别映射到主 PIC 和从 PIC 的 IDT 中的偏移 20h 和 28h。

/* ICW2: master offset of 20 in the IDT, slave offset of 28 */

__outb( PIC_MASTER_IMR_PORT, 0x20 );
__outb( PIC_SLAVE_IMR_PORT, 0x28 );

这意味着键盘被映射到矢量编号 2c,主通道和辅助通道将分别映射到 2e 和 2f。如果我更好地提出这个问题,你们中的一些人可能会给我更好的答案,但无论如何我感谢您的帮助!

82801EB ICH5 数据表的表 45 详细介绍了 8259 的 IRQ 线,在我的操作系统中,主设备仅在偏移 20h 处加载,从设备为 28h。

谢谢!

于 2009-04-21T19:34:25.097 回答
0

INT 21h / AH=25h - 设置中断向量;输入:AL = 中断号。DS:DX -> 新的中断处理程序。

于 2010-01-24T23:06:42.027 回答