全部博文(44)
分类:
2010-03-08 12:58:51
有没有操作系统不支持APIC?有,某些嵌入式系统。但在很多年前,Windows95/98、Unix、Linux、Solaris and so on都不支持。APIC这样的高档货,总得有人用吧,Intel虽然习惯为新技术推出一些实现范例,但还没闲到写一个支持APIC的操作系统供大家参考的程度。这时,微软走在了前面,Windows NT,以及基于NT架构的Windows2000率先支持APIC系统。那是一个PIC、APIC混存的时代,必须提供一个让不能使用APIC的OS回到PIC的途径,这就是中断路由。
图3-8中断路由
笔者:MP spec描述了这样一种情况:系统中有两个IOAPIC1、IOAPIC2(如图15)。IOAPIC1接ISA设备,IOAPIC2接PCI设备。其中硬盘使用PCI controller,连接IOAPIC2。根据MP spec对PIC、APIC共存情况的规定,系统启动首先进入PIC mode或Virtual Wire mode,此时IOAPIC2不可用。若需要从硬盘读数据怎么办?路由,把IOAPIC2上的非ISA中断路由到IOAPIC1和PIC的ISA中断管脚来。这种情况是合理的,但会让人产生如下误解(当然,可能你不会误解,但俺着实误解了好久):1)中断路由是为多IOAPIC系统引入的。当然不是,它出现的原因前面说了。2)IOAPIC2的中断路由到PIC就行了,干嘛要接到IOAPIC1上?思来想去也觉得这是个实现问题,或许硬件上有某些我们不知道的原因。
要详细了解中断路由,一篇好的文章是Intel公司Joseph A.Bennett所著的《Interrupt Routing Mechanism For Routing Interrupts From Peripheral Bus to Interrupt Controller》,此文讲述了如何构造中断路由网络。不过从一个软件程序员的角度来看,这篇文章的废话着实多了点~~~~~~~~~~~~~
MP spec规定了两种模式:Variable Routing和Fixing Routing。
动态路由,或者称可控路由。使用这种方式,系统可以在进入APIC模式后,关闭路由网络,此时PCI中断就不在映射到ISA中断管脚上,而通过自己的IOAPIC发送中断。
在有IMCR的系统中,当软件通过IMCR切换到APIC模式时,路由网络被关闭。
对于系统中没有IMCR,或者有一个(多个)IOAPIC不在IMCR控制下时,由硬件保证进入APIC模式后路由网络关闭。这过程要求对系统软件(BIOS、OS)透明,无需它们做额外的工作。
笔者:spec没有指明硬件如何在没有IMCR情况下关闭路由网络,这是个实现相关的问题。但spec又明确的暗示,硬件必须探测到操作系统对IOAPIC的编程动作,并关闭路由网络。故我们是不是可以认为,当我们开始操作IOAPIC时,路由网络就关闭了 ……《Interrupt Routing Mechanism For Routing Interrupts From Peripheral Bus to Interrupt Controller》一文中把RTE的mask bit引出来做非运算同IRQ line过或门的逻辑很有启发,对硬件感兴趣的朋友可以研究一下。
这是一种老的路由方式,用于没有实现Variable Routing的系统。计算机中的“老方式”,显而易见的等同于“笨拙”、“不方便”、“万恶” ……
在Fixing Routing的情况下,路由网络是无法从硬件上关闭的,只能通过软件的方法来避免APIC模式下的中断复接(Duplicate Interrupt)。
笔者:中断复接(Duplicate Interrupt)是指在多IOAPIC系统中,如图15,非ISA中断路由到接ISA中断管脚的IOAPIC,在路由网络无法关闭时,进入APIC模式后同一中断连接两个IOAPIC的情况。前面我们已经提出疑问了,只路由到PIC上不就好了 ……
BIOS可以通过对MP table进行适当的配置来避免中断复接,根据硬件连接不同,又可以分为两种情况:
路由到的ISA管脚接有ISA设备:
这种情况下,BIOS只为该ISA中断管脚设置MP table entry,而不为PCI设备连接到的IOAPIC管脚设置entry。简言之,即进入APIC模式后,PCI设备连接到IOAPIC2的管脚不起作用,统一使用ISA中断管脚发送中断。
笔者:无论是MP spec,还是《Interrupt Routing Mechanism For Routing Interrupts From Peripheral Bus to Interrupt Controller》,都透露出一个意思:中断路由并非每个PCI管脚路由到单独的ISA管脚,而是所有PCI管脚都路由到同一个ISA管脚。其结果是PCI、ISA设备共享中断,性能当然好不了(并且还有我们前面提到的ISA中断共享的问题)。当然,避免路由到不能共享中断的ISA管脚是硬件厂商的义务。
路由到的ISA管脚没有ISA设备:
这种情况下,BIOS为PCI设备连接的IOAPIC2管脚设置MP table entry,而不为路由到的ISA管脚设置entry。和情况1相比,这在进入APIC模式后,就没有那么重的中断共享负担了。
对OS的暗示
一句话,OS应该根据MP table报告的中断entry配置自己的中断系统,而不应该自己去探测IOAPIC的管脚,那些没有出现在MP table中的管脚都应该被mask住 …… 这是典型的硬件厂商思维,须知OS厂商从来都不相信BIOS厂商,它们经常为BIOS厂商背黑锅。几乎没有用户在遇到系统崩溃时会认为这是个BIOS BUG …… 于是,微软说:要自由! Intel说:给你自由! …… ACPI诞生了 ……
笔者:MP spec毕竟已经是过时的东西,微软有一篇文章为ACPI下的中断路由提供了范例。可惜俺不懂ASL语言,有兴趣的朋友可以参考:
《PCI IRQ Routing on a Multiprocessor ACPI System》
写在后面的话
如果你看到这里,非常感谢你忍受我通篇的唠叨。写文章太痛苦了,比看代码痛苦十倍!还好,写完了,都结束了,不想再写了 ……