Chinaunix首页 | 论坛 | 博客
  • 博客访问: 375504
  • 博文数量: 44
  • 博客积分: 2060
  • 博客等级: 上尉
  • 技术积分: 528
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-17 20:50
文章分类
文章存档

2011年(1)

2010年(28)

2008年(15)

分类:

2010-03-08 12:58:51

3.3 IOAPIC情况下的中断路由

有没有操作系统不支持APIC?有,某些嵌入式系统。但在很多年前,Windows95/98UnixLinuxSolaris and so on都不支持。APIC这样的高档货,总得有人用吧,Intel虽然习惯为新技术推出一些实现范例,但还没闲到写一个支持APIC的操作系统供大家参考的程度。这时,微软走在了前面,Windows NT,以及基于NT架构的Windows2000率先支持APIC系统。那是一个PICAPIC混存的时代,必须提供一个让不能使用APICOS回到PIC的途径,这就是中断路由。

3-8中断路由

笔者:MP spec描述了这样一种情况:系统中有两个IOAPIC1IOAPIC2(如图15)。IOAPIC1ISA设备,IOAPIC2PCI设备。其中硬盘使用PCI controller,连接IOAPIC2。根据MP specPICAPIC共存情况的规定,系统启动首先进入PIC modeVirtual Wire mode,此时IOAPIC2不可用。若需要从硬盘读数据怎么办?路由,把IOAPIC2上的非ISA中断路由到IOAPIC1PICISA中断管脚来。这种情况是合理的,但会让人产生如下误解(当然,可能你不会误解,但俺着实误解了好久):1)中断路由是为多IOAPIC系统引入的。当然不是,它出现的原因前面说了。2IOAPIC2的中断路由到PIC就行了,干嘛要接到IOAPIC1上?思来想去也觉得这是个实现问题,或许硬件上有某些我们不知道的原因。

要详细了解中断路由,一篇好的文章是Intel公司Joseph A.Bennett所著的《Interrupt Routing Mechanism For Routing Interrupts From Peripheral Bus to Interrupt Controller》,此文讲述了如何构造中断路由网络。不过从一个软件程序员的角度来看,这篇文章的废话着实多了点~~~~~~~~~~~~~

MP spec规定了两种模式:Variable RoutingFixing Routing

动态路由,或者称可控路由。使用这种方式,系统可以在进入APIC模式后,关闭路由网络,此时PCI中断就不在映射到ISA中断管脚上,而通过自己的IOAPIC发送中断。

在有IMCR的系统中,当软件通过IMCR切换到APIC模式时,路由网络被关闭。

对于系统中没有IMCR,或者有一个(多个)IOAPIC不在IMCR控制下时,由硬件保证进入APIC模式后路由网络关闭。这过程要求对系统软件(BIOSOS)透明,无需它们做额外的工作。

笔者:spec没有指明硬件如何在没有IMCR情况下关闭路由网络,这是个实现相关的问题。但spec又明确的暗示,硬件必须探测到操作系统对IOAPIC的编程动作,并关闭路由网络。故我们是不是可以认为,当我们开始操作IOAPIC时,路由网络就关闭了 ……Interrupt Routing Mechanism For Routing Interrupts From Peripheral Bus to Interrupt Controller》一文中把RTEmask 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管脚。其结果是PCIISA设备共享中断,性能当然好不了(并且还有我们前面提到的ISA中断共享的问题)。当然,避免路由到不能共享中断的ISA管脚是硬件厂商的义务。

路由到的ISA管脚没有ISA设备:

这种情况下,BIOSPCI设备连接的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


写在后面的话

    如果你看到这里,非常感谢你忍受我通篇的唠叨。写文章太痛苦了,比看代码痛苦十倍!还好,写完了,都结束了,不想再写了 ……

阅读(4586) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~