在英特尔软件开发人员手册中,它说中断向量32-255通常是用户为外部IO设备定义的。在我的系统编程类中,我必须开发一个简单的设备驱动程序我的问题是如何定义用于特定设备的特定中断向量?这是用BIOS完成的吗?
注意:我们正在开发一个简单的操作系统,所以我的情况非常具体,但是,最后我需要了解这一切是如何在x86系统上发生的。目前我们的系统已设置好,以便将一些32以上的中断向量分配给串口和键盘等设备。在阅读英特尔82801EB ICH5 IO控制器的数据表时,特别是有关8259 PIC的部分,它说IRQ15是辅助IDE通道。最终如何将其作为中断向量放在堆栈上?
我可能会非常困惑,这个问题没有意义,所以我提前道歉。
编辑:所以我们的系统编程类有一个非常简单的操作系统,它具有内核例程,用于安装ISR以处理给定矢量编号的特定中断。在上一季我们班上,教授给了我们一个头文件,将键盘定义为向量编号0x2c或类似的东西。我试图找出如何使用我们的内核例程将主要和/或辅助IDE通道中断映射到各种ISR。目前,所有未使用的中断向量都有一个默认处理程序,如果发生中断,它将打印消息,因此IDE中断暂时不会打开,但这是另一个问题。答案 0 :(得分:1)
我已经处理了这些东西已经有一段时间了,所以这可能会关闭:我记得PC中断控制器有15条IRQ线。这些映射到特定的相邻x86中断向量。因此,当外设触发IRQ线时,PIC会中断CPU并告知哪个向量跳转到,就好像执行了相应的INT指令一样。有些IRQ硬编码到某些外设,但我相信PCI设备会与操作系统协商IRQ和其他一些资源(与传统的ISA PnP设备一样)。
我不明白你的意思是'最终如何将它作为中断向量放在堆栈上?'
答案 1 :(得分: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
答案 2 :(得分:1)
设备有两种可能的方式来获得中断:
使用即插即用或Pci机制。如果这样做,BIOS将调用您的外围设备并询问资源要求。然后,您的驱动程序可以枚举即插即用设备,搜索支持的设备并从设备获取硬件中断。
如何在早期完成:只需使用一个中断。在设备上添加一个dip开关,允许用户在不同的中断之间进行选择。资源分配现在由用户掌握。用户还会在加载时以某种方式将中断号传递给驱动程序。
现在如何挂钩中断:这取决于操作系统和x86运行的模式。对于裸露的裸骨系统,您可以通过特殊指令查询IDT(中断描述符表)。获得IDT后,您可以获取地址并将IRQ处理程序的地址戳入正确的插槽。对于实模式,我不知道它是如何完成的。
如果您至少有一些实时操作系统或类似OS的运行,可能已经有一个内核功能为您完成了艰苦的工作。
答案 3 :(得分:0)
我记得在内存空间的开头有一个向量表,它指向在发生特定中断时调用的例程。我可能在这里打得太低了(旧的x86汇编程序员)但是在基础级别你可以在那个表中安装你的矢量然后调用你的例程。我没有收到任何旧的参考资料,所以不能给你实际的电话,但如果官方方法在BIOS之外运行,我会感到惊讶。
在GUI的这些日子里,我确信还有其他更合适的方法,允许中断共享和所有好东西。
编辑:忽略大部分内容,我刚刚看到你正在查看中断16及以上的硬件中断之外的中断。在那个空间中有任何有趣的硬件之前我离开了那个级别的编程,所以我只处理了前15个IRQ(第16个是控制器之间的级联)。我要离开它以防其他人感兴趣:)答案 4 :(得分:0)
好吧,我似乎在我们的支持代码中找到了答案,特别是PIC初始化例程。使用以下代码,IRQ线分别映射到主ID和从属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 );
__outb( PIC_MASTER_IMR_PORT, 0x20 );
__outb( PIC_SLAVE_IMR_PORT, 0x28 );
这意味着键盘被映射到向量编号2c,主要和辅助通道将分别映射到2e和2f。如果我更好地提出这个问题,你们中的一些人可能会给我更好的答案,但无论如何我都很感激帮助!
82801EB ICH5数据表的表45详细介绍了8259的IRQ线路,在我的操作系统中,主机只需在偏移20h加载,从机为28h。
谢谢!
答案 5 :(得分:0)
INT 21h / AH = 25h - 设置中断向量; 输入:AL =中断号。 DS:DX - >新的中断处理程序。