假设有一个端口映射的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
我正在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
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.
但我听不懂。有人能告诉我在
假设我有如下代码:
local_irq_disable();
... // some interrupts come during this time
local_irq_enable();
在我调用local_irq_enable()之后,所有阻塞的中断(挂起的中断)仍然存在&导致cpu响应。有什么东西可以清除挂起的中断吗?我的代码运行在ARM aarch64机器上。
我正在学习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
我想知道在Linux中,x86_64可以使用哪些不同类型的IPI。特别是,我想找出IPI中断的不同中断处理程序。
在理解Linux (丹尼尔·P·博维的第三版)中,Marco 列出了三种IPI:
CALL_FUNCTION_VECTOR
RESCHEDULE_VECTOR
INVALIDATE_TLB_VECTOR
但是,在最新的内核中,我在arch/x86/include/asm/entry_arch.h中找到了以下评论。
* This file is designed to contain the BUILD_INTERRUPT specifications for
* all of