据说
当 PIC 发送中断时,PIC 不会从同一源发送另一个中断,直到它通过 I/O 端口得到确认。这是因为中断处理程序通常操纵关键数据结构,并且不能承受被自己的新调用中断(即它们不是可重入的)。
我不明白。同源中断和不同源的中断有什么不同吗?
据说
当 PIC 发送中断时,PIC 不会从同一源发送另一个中断,直到它通过 I/O 端口得到确认。这是因为中断处理程序通常操纵关键数据结构,并且不能承受被自己的新调用中断(即它们不是可重入的)。
我不明白。同源中断和不同源的中断有什么不同吗?
您可以从不同的来源获得中断:定时器、硬盘、网络等。这些中断中的每一个都将由不同的中断处理程序处理。
因此,如果来自源 (S1) 的中断到达而来自源 (S2) 的另一个中断正在处理,则没有问题。两个中断都由不同的中断处理程序处理。
另一方面,如果来自源 (S) 的中断到达,而该源的处理程序正在处理另一个中断,则处理程序将无法处理第二个中断,因为它不是以可重入方式设计的(即它不能被中断,处理新的中断,然后返回处理原来的中断)。
您可以查看Understanding the Linux Kernel ,了解有关Linux 内核中中断工作方式的详细信息。
来自同一源的中断必须在与当前活动中断相同的数据结构上运行。来自不同来源的中断将在不同的数据结构上运行。因此,除非它们足够聪明以协调它们的活动,否则您不能同时激活来自同一源的两个中断,并且当前的设计阻止它们处于活动状态,这样程序员就不必担心这种复杂性。
以现实世界中的(人为的)示例为例,想象一张桌子,人们去那里取票,根据姓氏的不同字母范围有不同的职员。两个姓氏以A结尾的人不能同时取票,否则负责他们的工作人员可能会混淆并出错。但是,姓以 A 结尾的人可以与姓以 Z 结尾的人同时取票,因为他们各自的职员在不同的姓名列表和票堆上进行操作,因此一个不会对另一个产生负面影响.
在这个例子中,客户姓氏的字母是源,客户是中断。职员是中断处理程序,名称列表和票证堆是内核数据结构。
其他答案很好,但要记住的另一件事是电平触发中断。如果中断控制器没有禁用它正在触发的中断,那么电平触发的中断将在 ISR 有机会告诉硬件停止中断之前立即重新触发自身。通常,ISR 不仅需要重置 PIC,还需要告诉正在与之交谈的硬件让其闭嘴。如果硬件继续中断,那么堆栈就会溢出,操作系统就会烤焦。