关于同一个源的中断的事情

据说

当PIC发送中断时,PIC将不会从同一个源发送另一个中断,直到通过I / O端口得到确认。 这是因为中断处理程序通常操纵关键的数据结构,并且不能承受被新的自身调用中断(即它们不可重入)。

我不明白。 在同一个源和不同源的中断之间有什么不同吗?

您可以从不同的来源获得中断:定时器,硬盘,网络等。每个中断将由不同的中断处理程序处理。

因此,如果来自源(S1)的中断到达而来自源(S2)的另一个中断正在被处理,则没有问题。 两个中断都由不同的中断处理程序处理。

另一方面,如果源(S)的中断到达,而该源的处理程序正在处理另一个中断,则处理程序将不能处理第二个中断,因为它不是以可重入方式设计的(即它不能被中断,处理新的中断,然后返回来处理原来的中断)。

有关中断在Linux内核中的工作方式的详细信息,请参阅了解 Linux内核。

来自同一个源的中断必须在与当前活动中断相同的数据结构上运行。 来自不同来源的中断将在不同的数据结构上运行。 所以你不能同时拥有两个来自同一个源的中断,除非它们足够聪明地协调它们的活动,而且目前的设计阻止了它们的活跃,所以程序员不必担心这种复杂性。

以现实世界中的一个(人为的)例子来想象一下,一张桌子上的人们去买东西的票,那里有不同的职员根据姓氏的不同范围的字母表。 姓A的两个人不能同时拿票,因为否则负责他们的职员可能会混淆,犯了一个错误。 然而,姓氏以A结尾的人可以同时以姓氏以Z结尾的人拿起票据,因为他们各自的职员在不同的名单和票据列表上操作,所以一个人不会对另一个。

在这个例子中,客户姓氏的字母是来源,客户是中断。 店员是中断处理程序,名单和一堆票的列表是内核数据结构。

其他答案很好,但还有一点需要注意的是电平触发中断。 如果中断控制器没有关闭正在触发的中断,那么在ISR有机会通知硬件停止中断之前,电平触发中断会立即重新触发。 通常情况下,ISR不仅需要重置PIC,还需要告诉其正在说话的harward闭嘴。 如果硬件继续中断,那么堆栈将溢出,操作系统将被烤干。