【问题标题】:Linux - nested interrupts [closed]Linux - 嵌套中断
【发布时间】:2016-04-04 07:46:39
【问题描述】:

Linux 是否使用嵌套中断?

我的意思是,例如,当从任何设备提供中断服务时,是否可以在此例程中允许进一步的中断?还是涉及到上半部和下半部?

编辑:

如果 Linux 使用嵌套中断,如何关心它们的堆栈?

【问题讨论】:

标签: linux interrupt interrupt-handling


【解决方案1】:

是的,Linux 中断是可重入的。 https://unix.stackexchange.com/a/7172/40346

Linux 内核是可重入的(与所有 UNIX 内核一样),这意味着 CPU 可以执行多个进程。他不必等到磁盘访问读取由极其缓慢的 HDD 控制器处理,CPU 可以处理一些其他内容,直到磁盘访问完成(如果完成,它本身会触发中断)。

通常,一个中断可以被另一个中断(抢占)中断,这称为“嵌套执行”。根据架构的不同,仍然有一些关键功能必须通过完全禁用中断来不间断地运行(非抢占式)。在 x86 上,这些是一些与时间相关的函数(time.c、hpet.c)和一些 xen 的东西。

关于中断只有两个优先级:“启用所有中断”或“禁用所有中断”,所以我猜你的“高优先级中断”是第二个。这是 Linux 内核唯一知道的有关中断优先级的行为,与实时扩展无关。

如果一个可中断中断(您的“低优先级中断”)被另一个中断(“高”或“低”)中断,内核会保存被中断中断的旧执行代码并开始处理新中断。这种“嵌套”可以发生多次,因此可以创建多级中断中断。之后,内核从旧中断重新加载保存的代码并尝试完成旧中断。

【讨论】:

  • 感谢您的回答。我有与嵌套中断有关的问题。堆栈会发生什么?如果系统支持嵌套中断,如何使用堆栈?每个中断都有自己的堆栈吗?
  • AFAIK,正如上面@Koppel 指出的那样,允许嵌套中断不同的IRQ 行。不一样的IRQ! IOW,在处理中断'n'时,中断'n'将被关闭,即它是不可重入的。当然,上半部分和下半部分仍然可以同时执行。另外,不,每个中断都没有它自己的堆栈:(通常)有一个由操作系统维护的单独的 IRQ 堆栈
  • 相关:How is CR8 register used to prioritize interrupts in an x86-64 CPU? - 它不再像打开/关闭中断那样糟糕/简单。
  • 但是 Linux 可能实际上并没有太多/根本没有使用 CR8 中断优先级的东西,或者至少在 2007 年没有使用过。(realworldtech.com/forum/?threadid=79538&curpostid=79545)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 2011-03-17
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
相关资源
最近更新 更多