【问题标题】:How to limits number of interrupts in a OS?如何限制操作系统中的中断数量?
【发布时间】:2014-03-24 00:50:39
【问题描述】:

我是 Linux 内核的新手。我正在阅读“Linux Kernel Development,Robert Love 3rd Edition,第 7 章中断和中断处理程序”中的 Linux 内核。为了注册一个中断处理程序,Linux 使用 request_irq() 函数:

int request_irq(  
    unsigned int irq ,  
    irq_handler_t handler,  
    unsigned long flags ,
    const char *name,
    void *dev)

由于我是 Linux Kernel 的新手,所以我对 Linux 中的中断有一些疑问:

Q1 -> Are interrupt lines are software or hardware ?  
Q2 -> "irq" , first argument passed to request_irq() , is it interrupt line number or interrupt number ?
Q3 -> If interrupt line is hardware then , is it the criteria to limit the number of different interrupts an OS can support , if it is not then how we limit the number of different interrupts an OS can support ?

还有一个帮助,当我阅读时,我被以下几行打动了:

"请注意,request_irq() 可以休眠,因此不能从中断上下文或其他代码无法阻塞的情况下调用。当休眠不安全时调用 request_irq() 是常见的错误。部分原因是request_irq() 可以阻塞:确实很清楚。(页码:117)"

我无法理解这些行的含义,为什么 request_irq() 不安全以及如何?而且我也无法理解中断上下文的确切含义?

如有任何帮助,我将不胜感激!
谢谢!

【问题讨论】:

  • 您目前如何回答这些问题?请尝试自己回答,我们无法告诉您是否正确。但请先向我们展示您自己完成的一些工作。
  • @JohannesH。 ,嘿....非常感谢你,真的是一个很好的建议。我在我的大学学习过操作系统课程,我真的无法自己回答这些问题,我问过......但我真的很感谢你的建议。

标签: linux linux-kernel


【解决方案1】:

Q1:Linux - 就像几乎所有其他操作系统一样 - 从中​​断硬件(生成它们的硬件)中抽象出中断源(例如,您附加处理程序的对象)。

中断由称为中断控制器的专用硬件单元管理,它将中断源多路复用到一条(或可能几条)中断线到 CPU。

需要这样的抽象有几个原因:中断控制器通常是分层的。在 ARM SoC 上尤其如此,其中 CPU 内核有两条直接中断线,其余的挂在一个或多个中断控制器上,提供数百个中断控制器。作为系统设计人员,可以将额外的中断控制器挂在现有线路上,并让内核以统一的方式管理它们。

另一个原因是将设备驱动程序与特定系统的中断架构隔离开来。

一些中断可以由软件产生。再次。操作系统将这些细节抽象掉。操作系统通常使用软件中断来执行优先级高于计划任务但不能在中断上下文中运行的处理。

Q2:Q1 的答案应该回答这个问题。

Q3:(硬件)中断源数量的限制取决于系统中中断控制器硬件的能力。用于管理这一点的内核数据结构是 - AFAICR - 在编译时调整大小。

最后,中断上下文指的是用于执行中断服务程序的堆栈和 CPU 状态(例如寄存器)。由于中断可能随时发生,而其他进程(或者实际上是其他 ISR)必须以有序的方式进行管理。

【讨论】:

  • 这里只有一个问题(因为我在这里不确定):如果中断结构大小被编译到内核中,通用内核变体如何处理这个问题?它们可以在(几乎)任何硬件上运行,至少应该能够......
  • 好的...这意味着 irq 是中断号,而不是中断行号 ....谢谢你 marko!
【解决方案2】:

除了@markos 回答之外,您还有一个关于request_irq() 不安全的问题:它本身并不是不安全的,如果您这样理解,那您就搞错了。但是由于 IRQ 是有限的资源,请求一个可能会阻塞您的程序,因为它必须等到有一个可用时才能使用。

现在,在正常的程序流程中,这不是什么大问题。程序在被阻塞时不能做任何事情,但是一旦注册了中断处理程序,它就可以正常继续。
然而,在处理中断的程序代码中,绝不允许程序阻塞。因为中断处理程序是在内核模式下执行的,不能被调度程序中断,所以现在其他程序可以在中断处理程序阻塞时运行。因此,无法释放任何资源 - 并且块永远不会结束。这会导致您的系统冻结。通常,您现在可以向它发送信号以杀死它。信号作为中断处理。但是由于已经处理了中断,并且您不能中断中断,因此这是行不通的。故事结束:不要在中断处理程序中阻塞调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多