《Interrupt in Linux(硬件篇)》

2020-05-21 00:00:00 触发 丢失 中断 文中 希望能

内容提要
章:介绍了PIC和APIC系统的基本架构,提供了了解现代中断系统构成的基本知识。
第二章:论述了Linux如何探测中断硬件,以及如何初始化它们。
第三章:补充了一些中断系统的硬件知识,没有它们你也应该能读懂前两章的内容。
文中用大量“题外话”介绍了中断相关的知识和原理,它们大部分是笔者感兴趣的,例如“Remote IRR的作用”、“Edge中断的共享与丢失”、“伪中断产生的原因”等。以“笔者”开头的文字,是作者自己对一些问题的看法,其中有很多不能解决的疑问,如果你知道答案,希望能通过 xing5820@163.com告诉我,让我及时更新相关内容。同时,非常欢迎指出文中的错误之处。
此文虽取名为“硬件篇”,但不代表就有一个“软件篇”存在。虽然目前内核使用了Generic Interrupt Layer,但这只是对原__do_IRQ()路径的封装,ULK3的内容完全适用于当前内核中断系统,软件相关内容可以参考此书。

不要怕问的问题简单,或者太异想天开。发文章的目的就是希望能借此和大家讨论把很多不清楚的地方搞清楚。
dengcainiao 兄弟就问了我很多问题,给了我不少启发让我纠正文中的错误。一个人能想到的东西毕竟有限,希望能集思广益。
比如dengcainiao 兄弟问我

就是为什么level触发不像edge触发一样也让io apic在CPU处理中断的时候也可以发送新的中断信息到LOCAL APIC呢?

复制代码
我原先想是电路实现保证的,后来又想想这样实现有什么好处,得出的结论是:
在一个中断在处理过程中,让同一类型的中断发送到LAPIC是种落后的机制。
因为中断只是要通知CPU该为设备服务了,驱动程序完全可以一次处理设备发生的多个中断。
例如:
设备发生了次中断A,CPU开始处理 ---->在CPU执行设备的中断处理函数前第二次中断发生了 ---> IOAPIC阻止该中断到达CPU ---->CPU执行中断处理函数,该函数发现设备有两次中断,一次处理掉 ---->设备拉低中断线

这样,就避免多打断CPU一次。更为先进的APIC,例如IA64平台的SAPIC,就有中断批处理的功能,减少因每次中断而引起的上下文切换开销。也是类似道理。
复制代码
欢迎类似的问题

内容补充:

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
初发表版本 

文章来源CU社区:《Interrupt in Linux(硬件篇)》

相关文章