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

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

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

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

有帮助吗?

解决方案 5

好了,我似乎找到了在我们的支持代码的答案,特别是PIC初始化程序。用下面的代码IRQ线在偏移20h和28H映射到IDT用于主设备和从设备的PIC,分别

/* 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线,而在我OS主被简单地装在偏移20h和从设备28H。

谢谢!

其他提示

可以编程PIC的(可编程中断控制器)来映射特定设备IRQ的。

在86中,有两个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'th位置。

您会发现这些有用的:点击 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

这已经有一段时间,因为我已经有这个东西处理所以这可能是关:我记得,PC中断控制器具有15条IRQ线。这些地图特定相邻的x86中断向量。因此,当一个外设触发IRQ线上,PIC中断CPU,并告诉跳到哪个矢量,仿佛对应INT指令被执行。一些IRQ是硬编码到某些外设,但我相信,PCI设备与操作系统进行的IRQ和其他一些资源的谈判(如做旧的ISA PnP设备)。

我不明白你的意思“怎么会最终堆栈作为中断向量上放?”

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

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

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

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

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

我记得存在的指向例程时特定中断发生时调用的存储空间开始的矢量表。我可以在这里过低的级别(旧x86汇编程序员)被击中,但在基本水平你安装在桌子那么你的程序被调用您的载体。我没有有任何我的老参考材料我所以不能给你实际的电话,但我会感到惊讶,如果官方法BIOS之外的工作。

在GUI的这几天我敢肯定有其他更合适的方法,允许中断共享和所有的好东西。

编辑:忽略太多的是,我刚刚看到您正在寻找在中断16及以上的被外面的硬件中断。我感动的节目是水平走之前有硬件的任何有趣的位在空间,所以我只处理了前15级的IRQ(16个是控制器之间的级联)。我要离开它只是在情况下,它的利益给其他人:)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top