全部博文(18)
分类: LINUX
2009-04-03 16:57:13
上半部(top half)
下半部(bottom half)
6.3 注册中断处理程序
函数:
|
释放中断处理程序
函数:
|
6.4 编写中断处理程序
函数:
|
返回值:IRQ_NONE——中断对应的设备不是注册处理函数时指定的产生源
IRQ_HANDLED——正确调用
或使用宏IRQ_RETVAL(x),若x非0,则返回IRQ_HANDLED,否则IRQ_NONE
6.5 中断上下文
由于中断打断了其他代码,中断处理程序必须尽可能简洁、迅速 => 把工作放在下半部中,选择合适的时间执行
中断处理程序栈
6.6 中断处理机制的实现
(1) 设备产生中断,通过总线把电信号发送给中断控制器
(2) 中断控制器把中断发送给处理器
(3) 处理器停止当前工作,关闭中断,跳到内存预定义位置开始执行中断处理程序
(4) 内核调用do_IRQ()-----unsigned int do_IRQ(struct pt_regs regs)
提取中断号 int irq = regs.orig_eax & 0xff;
对所接收中断应答,禁止这条线上的中断传递------mask_and_ack_8259A();
(5) 确保中断线上有一个有效的处理程序,调用handle_IRQ_event(),在该线上运行所有中断处理程序;
(6) 如果没有,调用ret_from_intr()返回内核,运行中断的代码
6.7 中断控制
中断控制方法表:(禁止、开启、屏蔽中断线,检查中断系统状态)
Function |
Description |
local_irq_disable() |
Disable local interrupt delivery禁止当前处理器(本地)中断 |
local_irq_enable() |
Enable local interrupt delivery 开启本地中断 |
local_irq_save() |
Save the current state of local interrupt delivery and then disable it 保存本地中断传递的当前状态,然后禁止本地中断传递 |
local_irq_restore() |
Restore local interrupt delivery to the given state 恢复本地中断传递到给定状态 |
disable_irq() |
Disable the given interrupt line and ensure no handler on the line is executing before returning 禁止给定中断线,并确保该函数返回前在该中短线上没有处理程序在运行 |
disable_irq_nosync() |
Disable the given interrupt line |
enable_irq() |
Enable the given interrupt line |
irqs_disabled() |
Returns nonzero if local interrupt delivery is disabled; otherwise returns zero 如果本地中断传递被禁止,则返回非0,否则0 |
in_interrupt() |
Returns nonzero if in interrupt context and zero if in process context 如果在中断上下文中,返回非0,如果在进程上下文中,则返回0 |
in_irq() |
Returns nonzero if currently executing an interrupt handler and zero otherwise 如果当前正在执行中断处理程序,则返回非0,否则0 |