内容提要
第一章:介绍了PIC和APIC系统的基本架构,提供了了解现代中断系统构成的基本知识。
第二章:论述了Linux如何探测中断硬件,以及如何初始化它们。
第三章:补充了一些中断系统的硬件知识,没有它们你也应该能读懂前两章的内容。
文中用大量“题外话”介绍了中断相关的知识和原理,它们大部分是笔者感兴趣的,例如“Remote IRR的作用”、“Edge中断的共享与丢失”、“伪中断产生的原因”等。以“笔者”开头的文字,是作者自己对一些问题的看法,其中有很多不能解决的疑问,如果你知道答案,希望能通过 xing5820@163.com告诉我,让我及时更新相关内容。同时,非常欢迎指出文中的错误之处。
此文虽取名为“硬件篇”,但不代表就有一个“软件篇”存在。虽然目前内核使用了Generic Interrupt Layer,但这只是对原__do_IRQ()路径的封装,ULK3的内容完全适用于当前内核中断系统,软件相关内容可以参考此书。
内容补充:
1、bluesky_jxc老大:对于PIC,IMR即使置位,IRR也会设置的。IMR不影响IRR,只是不允许对应IRR参与中断优先级仲裁。
作者理解:在内核邮件列表也看到有人说道:对于edge中断,即使mask了也会pending住,在unmask的时候发送给CPU。应该就是bluesky_jxc说的这个机制了。该机制保证了edge触发中断不会在mask的时候丢失。
对于APIC情况下的edge中断,操作系统应该不会在处理中断的时候mask它(至少linux没有),最大程度避免了丢失中断的情况。
2、此文中中断初始化的路径只适用于系统使用MP spec的情况,惭愧,现在才发现把ACPI的初始化路径写掉了![]()
Revision History
日期
版本
描述
2008.5.3
1.1
Ÿ 根据 albcamus 同学的建议,修改了文中多处错误
Ÿ 根据Bluesky_jxc同学的补充,修改了edge中断共享与丢失的内容
Ÿ Bluesky_jxc同学补充了PIRQ Table章节
2008.4.27
1.0
最初发表版本
924.66 KB, 下载次数: 8424
原帖由 zx_wing 于 2008-4-27 20:51 发表
搞了两个小时都没找到一个好的word转pdf的软件。
用的公司的机器,不能安盗版,最后还是用openoffice转的,可惜格式乱了,目录没了。大家只有凑合着看
就是为什么level触发不像edge触发一样也让io apic在CPU处理中断的时候也可以发送新的中断信息到LOCAL APIC呢?
在一个中断在处理过程中,让同一类型的中断发送到LAPIC是种落后的机制。
因为中断只是要通知CPU该为设备服务了,驱动程序完全可以一次处理设备发生的多个中断。
例如:
设备发生了第一次中断A,CPU开始处理 ---->在CPU执行设备的中断处理函数前第二次中断发生了 ---> IOAPIC阻止该中断到达CPU ---->CPU执行中断处理函数,该函数发现设备有两次中断,一次处理掉 ---->设备拉低中断线
这样,就避免多打断CPU一次。更为先进的APIC,例如IA64平台的SAPIC,就有中断批处理的功能,减少因每次中断而引起的上下文切换开销。也是类似道理。
原帖由 bluesky_jxc 于 2008-4-28 14:54 发表
另外还有一个问题,你说APIC ID 4 bit, 最多15个,另一个给IOAPIC。
我想知道广播是怎么实现的?难道有另外的线来实现?
原帖由 bluesky_jxc 于 2008-4-28 15:12 发表
ICR里面有个dest shorthand的位,用来表示是否是广播,是广播的话,ID区域就不再care了。
谢谢haitao热情赞助
原帖由 zx_wing 于 2008-4-28 14:21 发表
IRR是指PIC的IRR吗?
看来我看的还是不仔细啊,内核邮件列表有人说对于edge中断,即使mask掉,也会被pending住,在unmask的时候发给CPU。看来就是这个机制保证ISA接PIC不丢中断了。
补充的好,又搞清楚一个 ...
这样,就避免多打断CPU一次。更为先进的APIC,例如IA64平台的SAPIC,就有中断批处理的功能,减少因每次中断而引起的上下文切换开销。也是类似道理。
原帖由 bluesky_jxc 于 2008-4-29 08:48 发表
ok, 我不得不说,it depends。。。
想象一下,如果每次检查都只有一个中断就绪,而action链表很长呢?
虽然每个isr会很快退出,但是从整体上面来讲,并不能说那种方法一定有优势
原帖由 bluesky_jxc 于 2008-4-29 10:44 发表
linux设计成每次中断都遍历整个action链表,但是并不表示所有操作系统都会这么设计,比如windows就是只要有一个isr完成了就返回。
各自有各自的优势,没办法说这种“批处理”好还是“单处理”好。
原帖由 zx_wing 于 2008-4-30 11:47 发表
PS:我要到版务去申请能不能给论坛加一个像邮件那种,一回复自动在头上加“>>”的功能,自己打太麻烦了。
原帖由 minifish 于 2008-5-3 09:08 发表
牛蛙的超牛作品,顶!
顺便问一个弱智问题:
你说的那个IMR置位的情况下,仍然会IRR有效,是从哪里看到的?
还有对于Edge中断,IO-APIC和Local APIC各自会pending一个,这个是从哪里看到的?
原帖由 zx_wing 于 2008-5-3 12:08 发表
>>对于APIC,IRR和ISR都在LAPIC中,所以只会在LAPIC中pending。
>>见x86 spec 3A卷第八章8.8.4节
原帖由 bluesky_jxc 于 2008-5-3 11:29 发表
copy from 8259 spec:
"Interrupt Request Register (IRR): 8-bit register which
contains the levels requesting an interrupt to be acknowledged.
The highest request level is reset from
the IRR wh ...
原帖由 minifish 于 2008-5-5 09:13 发表
多谢!
但是对于pending两个的说法,我还是有点不理解。
你说的这种情况,我觉得实际上是只pending了一个“待处理”中断,因为另一个已经在处理了。
From SDM 8.8.4:
IF more than one interrupt is gene ...
原帖由 minifish 于 2008-5-30 10:08 发表
问一个傻B的问题,为什么要把PCI的中断转成ISA中断?
PCI中断是active low, level triggered,ISA中断是edge triggered.
PIC是可以接受level中断的,只是要求active high
因为这个对PCI中断进行转换是必要的 ...
原帖由 zx_wing 于 2008-5-30 11:53 发表
我想可能有两个方面的问题吧。第一是这篇文献很早,当时用的PIC还不是我们现在用的8259,能不能接收level中断还不清楚
第二是PCI转isa可能要和其它ISA中断共用一个管脚,如果一个是level一个是edge,是否edg ...
原帖由 minifish 于 2008-5-30 16:26 发表
第一个应该很可能,建议文章里面提一下?会不会让大家都误认为现在的8259还是那样子。
第二个我觉得不可能,ISA的edge中断是不共享的,更不会跟PCI转过来的ISA中断共享了。
原帖由 zx_wing 于 2008-5-30 18:46 发表
第二个会哈,MP spec明确规定了中断路由ISA edge中断和PCI中断转edge中断共享的情况。
ISA中断能不能共享看设备实现,没有定论的哈
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |