我正在尝试理解Linux的中断处理机制。我试着用谷歌搜索了一下,但没有找到这个问题的答案。有没有人能给我解释一下为什么handle_IRQ_event最后要调用local_irq_disable?在此之后,控制返回到do_irq,它最终将返回到入口点。那么谁将重新启用中断呢?这是中断处理程序的责任吗?如果是这样,为什么会这样呢?
编辑
供参考的代码
asmlinkage int handle_IRQ_event(unsigned int irq, struct pt_regs *regs, struct irqaction *action)
{
int status = 1;
我正在学习Linux内核中的中断处理,并在下面的代码片段中尝试在IRQ2上注册一个虚拟irq处理程序。但是它似乎没有被注册,因为我看到了一个负的返回值和内核中的一条消息,如下面所示,这来自于试图执行free_irq()的清理函数
[ 2203.989585] Trying to free already-free IRQ 2
下面是来自内核日志的printk,这表明它还没有注册:
Here with registering IRQ handler on IRQ2 for flowTest...retval_irqreg= -22
下面是我的代码的相关部分,它有四个功能
1 the bottom
假设有一个端口映射的I/O设备,它在IRQ线路上任意生成中断。设备的挂起中断可以通过对特定寄存器的单个outb调用来清除。
此外,假设下面的中断处理程序通过request_irq分配给相关的IRQ行
irqreturn_t handler(int irq, void *data)
{
/* clear pending IRQ on device */
outb(0, CLEAR_IRQ_REGISTER_ADDR);
/* device may generate another IRQ at this point,
* but
下面是Cortex A Prog Guide中提到的流程,我对文本有几个问题。
因此,可重入中断处理程序在引发IRQ异常并以前面描述的方式将控制权转移到中断处理程序之后,必须执行以下步骤。
·中断处理程序保存被中断程序的上下文(即,它将被处理程序损坏的任何寄存器推送到备用内核模式堆栈上,包括返回地址和SPSR_IRQ)。
Q> What is the alternative kernel mode stack here ?
·确定需要处理哪个中断源,并清除外部硬件中的中断源(防止其立即触发另一个中断)。
·中断处理程序将处理器更改为其他内核模式,并保留CPSR I位设置(中断仍处于禁用状
假设我有如下代码:
local_irq_disable();
... // some interrupts come during this time
local_irq_enable();
在我调用local_irq_enable()之后,所有阻塞的中断(挂起的中断)仍然存在&导致cpu响应。有什么东西可以清除挂起的中断吗?我的代码运行在ARM aarch64机器上。