我正在Intel Atom处理器上编写一个LinuxV3.2内核模块(x86_64,2核)。我想禁用一个特定的IRQ号,但是在Linux上这样做有困难。
我是双引导MS-DOS,通过直接与8259 PIC芯片通信,我可以很容易地禁用英特尔语法x86程序集中的中断:
CLI ; disable all interrupts
MOV DX, 0x21 ; set 8259 ioport address
IN AL, DX ; store current interrupt mask in AL
AND AL, 0xDF ; m
我正在尝试理解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;
假设有一个端口映射的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
ARM的Linux内核基本上在一个循环中执行CPU_idle:
while (1) {
disalbe_irq
wfi
enable_irq
}
我可以理解这个逻辑的工作,因为"wfi“唤醒手臂,而不管IRQ/FIQ的状态。然而,为什么"wfi“必须放在disable_irq和eanble_irq的括号里呢?
源代码/arch/arm/process.c有以下建议:
* We need to disable interrupts here
* to ensure we don't miss a wakeup call.
但我听不懂。有人能告诉我在