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

2011年(1)

2010年(28)

2008年(15)

分类: LINUX

2008-04-28 21:25:31

中断转ISA中断协议

PCI为啥要转ISA中断?这是很堂皇问题,毕竟,任何退步都是可耻的。但在计算机领域,兼容才是王道,才是市场。否则,Intel就不会栽个跟头让AMD风光好几年 …… 我的废话好像有点多了。

话归正题,也是个很堂皇的答案,PIC是为ISA设计的,不是为你PCI设计的。当然,你可以接APIC,不过在旧社会是没有它滴。旧社会,PCI要接PIC

ISA中断和PCI中断最大的不同在哪儿?ISA是上升沿触发的(low-to-high edge sensitive),PCI是低电平有效、电平触发的(active low, level sensitive)。(我们不要那么麻烦,记住ISAedge触发,PCIlevel触发就好了)。PCI要接PIC,就需要把level触发转换成edge触发。本章介绍PCI中断转ISA中断协议,它是中断路由可以产生的基础(中断路由见下一章)。

Intel公司Albert R.Nelson等人的《PCI to ISA Interrtup Protocol Converter and Selection Mechanism》一文讲解了实现。

先来看副图:

3-5 PCIISA概要

内容有点多,不用全看,看下面画框的部分就可以了(我也想用红色画个框,但不知道这是什么鬼图,硬上不了色!)。

图中有几个主要部件,一个是ISA总线,它的中断线连接到SIOSIO在本章中看作PIC即可);一个是Interrupt PAL(简称PAL,它是完成PCI中断转换到ISA中断的关键),连接3PCI slotSIO;还有一个SEL REG。三者中的关键是PAL,只要明白它的结构,整个协议就清楚了,其结构见下图:

3-6 PAL结构

图中,PCI4条中断线INTAINTBINTCINTD通过一个或门产生INT信号,接入状态机。INTR(即PICINTR脚)和一个RESET脚一起接入状态机(STATE MACH)。这里INTR脚在图中又标为INTA,为了避免和PIC中的INTA(有上划线那个)混淆,下文仍称它为INTR

笔者:这万恶的图啊,搞一个这么容易混淆的标注,我就把它和PICINTA混淆了,直接导致后来在看状态机时想不通其原理,还自己提出N种说法来解释,真是E$%^#$&$%&%^&*$%&&%

SEL1SEL0对应SEL REG,用于控制中断通过哪条IRQ线连到PIC(图中为IRQ9IRQ10IRQ11)。图中的选择器ISA IRQ Select MUX还有一个输入为IRQ,它是状态机的输出。整个PAL的运作,主要是靠状态机控制,下图为所有状态的转换情况:

3-7 状态转换图

笔者:再强调一次,图中的INTA就是PICINTR脚。并且图中的各个管脚,我们统一用高电平表示有效电平。否则英文中一个active,我就要打4个字,太麻烦了。

状态机RESET过后处于IDLE状态,此时没有中断。当某个PCI设备把自身中断线拉到有效电平后,INTA/B/C/D变为高电平,通过或门后INT变高,从而IRQ变高。状态机在下一个时钟上升沿时(状态机由图中PCICLK信号驱动)进入N1状态。此时INTR脚如果拉高,说明CPU正在处理PIC提交的中断,故停留在N1状态等待。此时,INT拉低或SEL0SEL1清零将导致返回IDLE状态。

笔者:PCI设备中断线active,但在有效时间内又in-active的情况少,但确实存在。对于SEL0SEL1清零即SEL REG清零。文章称这代表BIOS(操作系统)不愿意接收PCI中断或表明这是一个特殊的中断,或默认中断。不太明白是什么意思。在我看来,SEL REG的用处本身就不明了,完全可以在布线时选一条没有ISA设备使用的管脚硬连线。提供这种动态选线的功能有什么好处?

INTR被拉低(如果它之前是高电平),代表CPU已经处理完先前中断,此时N1状态前进到N2状态。如果INTSEL0SEL1发生了和N1状态相同的变化,就回到IDLE。如果INTR仍为低电平,表示PIC还没有中断CPU,状态机停留在N2INTIRQ都维持在原电平。

笔者:原文这样描述:When the INTA signal again goes active, it indicates that CPU is responding to an interrupt which may be the interrupt generated by the PCI agent …… 搞不清楚这里的”is responding to”该怎么翻译,如果翻译成应答(即acknowledge)显然不合适。因为PIC必须先拉高INTRCPU才能通过INTA脚应答。这里的N2状态中,INTR变高,只能说明PIC中断CPU,不能说明CPU应答了 …… 唉,英语太烂,只能这样讲了。

INTR变高,便进入了N3状态,且该状态将一直维持到INTR拉低。该状态代表CPU正在处理一个可能是自己发起的中断。N3状态中,SEL0SEL1清零将导致回答到IDLE。在此状态下,状态机的IRQ脚继续维持在高电平。一旦INTR拉低,状态机从N3转移到R1R2R3三个状态,在每个状态停留一个PCICLK周期,最后回到IDLE。如果此时INT脚仍然为高,说明N3状态中,CPU处理的不是自己发出的PCI中断,状态机迁移到N1继续前面的过程。

OK,明白没?没明白只有看原文了。

笔者:文章强调:”It should be understood that the series of states following the N3 state through the R1, R2 and R3 state, back through the IDLE state and to N1 state provides a necessary delay. It is this delay and the switch off and back on of the IRQ signal from the interrupt PAL that converts the PCI compliant level sensitive interrupt received by the interrupt PAL to the low-to-high edge sensitive interrupt driven to the interrupt controller of the SIO component as an ISA IRQ compliant signal”。我看不出来从N3R1R2R3IDLE再到N1提供了一个多么必要的delay。这个delay只有在转换完一个PCI中断,马上转换下一个时才necessary。也就是INT脚在状态机遍历完所有状态后仍然为高电平,需要再次进行PCI to ISA转换的情况。为了构建一个上升沿,我们需要一段时间维持在低电平,这就是R1R2R3三个延时状态的作用。

与之相比,我认为” the switch off and back on of the IRQ signal”比较关键。Edge触发和level触发毕竟不相同,虽然说一个高电平有效的level触发也有一个上升沿,但ISA IRQ Select MUX的输出总不能一直在高电平吧。什么时候switch off的呢?我认为是在N3中。尽管此时状态机的IRQ输出仍为高电平,但我们注意到,N3回到IDLE的情况中,INT变低这一情况已经没有了。在N1N2中它都有的。这说明此时INT变低已经不影响大局,由此推断,ISA IRQ Select MUXN3中已经switch off了它的输出,完成了一次leveledge的转换。

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