ILD

Kernel Interrupts
作者:YUAN JIANPENG 邮箱:yuanjp@hust.edu.cn
发布时间:2018-8-4 站点:Inside Linux Development

Linux内核支持Nested interrupt,但是不支持reentrant interrupt。处理某一中断时,同类型的中断在所有CPU上被禁止,因此ISR不必设计成可重入的。但是新的其它类型的中断可以打断正在处理的中断,这就是中断嵌套,isr需要支持nested  interrupt。


中断相关的API

local_irq_disable() 禁止本地中断

local_irq_enable() 激活本地中断

local_irq_save() 保存本地中断的当前状态,然后禁止本地中断

local_irq_restore() 恢复本地中断到给定的状态。

disable_irq() 禁止给定中断,并且保证函数返回时,该中断的ISR运行完毕。

disable_irq_nosync() 禁止给定中断

enable_irq() 激活给定中断

irqs_disable() 本地中断是否被禁止

in_interrupt() 是否在中断上下文(包括软中断)

in_irq() 内核是否在执行中断处理程序


Linux Kernel Development

Linux中的中断处理程序是无需重入的,当一个给定的中断处理程序正在执行时,相应的中断在所有处理器上都会被屏蔽掉,以防止在同一中断线上接收另一个新的中断。通常情况下,所有其它的中断是打开的,所以这些不同中断线上的其它中断都能被处理。


曾经,中断处理程序没有自己的栈,使用被中断的进程的栈,后来进程栈大小从2个page,减小到1个page,即4K。为了应对进程栈减小,中断有了自己的栈,大小为1页。


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.