linux内核设计与实现-第7章 中断和中断处理
-
7.1 中断
中断值通常被称为中断请求线(IRQ)
异常也常常被称为同步中断
-
7.3 上半部与下半部的对比
一般把中断处理分为两个部分或两半,中断处理程序是上半部,能够被允许稍后完成的工作会推迟到下半部去。
-
7.4 注册中断处理程序
驱动程序通过request_irq()函数注册一个中断处理程序
#include <linux/interrupt.h>
typedef irqreturn_t (*irq_handler_t) (int, void *);
/* request_irq:分配一条给定的中断线 */
int request_irq(unsigned int irq,irq_handker_t handler,unsigned long flags,const char *name,void *dev)
第三个参数 flags可以为0,也可以是位掩码。
定义在<linux/interrupt.h>
| 标志位 | 说明 |
| IRQF_DISABLED | 处理中断处理程序本身期间,禁止其它所有中断 |
| IRQF_SAMPLE_RANDOM | 产生的中断对内核熵池有贡献 |
| IRQF_TIMER | 该中断是特别为系统定时器的中断处理而准备的 |
| IRQF_SHARED | 可以在多个中断处理程序之间共享中断线 |
-
7.4.3 释放中断处理程序
中断注册方法表
| 函数 | 描述 |
| request_irq() | 在给定的中断线上注册一给定的中断处理程序 |
| free_irq() | 如果在给定的中断线上没有中断处理程序,则注销响应的处理程序,并禁用其中断线 |
-
7.5 编写中断处理程序
中断处理程序 声明
static irqreturn_t intr_handler(int irq, void *dev)
-
7.5.1 共享的中断处理程序
内核接收一个中断后,它将依次调用在该中断线上注册的每一个处理程序。因此,一个处理程序必须知道它是否应该为这个中断负责
-
7.8 /proc/interrupts 系统中与中断相关的统计信息
-
7.9.1 禁止和激活中断
local_irq_disable();
/**禁止中断*/
local_irq_enable();
-
7.9.2 禁止指定中断线
void disable_irq(unsigned int irq);
void disable_irq_nosync(unsigned int irq);
void enable_irq(unsigned int irq);
void synchronize_irq(unsigned int irq);
禁止多个中断处理程序共享的中断线是不合适的。禁止中断线也就禁止了这条线上所有设备的中断传递。因此,用于新设备的驱动程序应该倾向于不使用这些接口。
根据规范,PCI设备必须支持中断线共享。因此,他们根本不应该使用这些接口。
-
7.9.3 中断系统的状态
#include <asm/system.h>
#include <asm/irq.h>
irqs_disable() //宏。本地处理器中断系统被禁止,返回非0,否则返回0
#include <linux/hardirq.h>
in_interrupt()
in_irq()
表7-2 中断控制方法的列表
| 函数 | 说明 |
| local_irq_disable() | 禁止本地中断传递 |
| local_irq_enable() | 激活本地中断传递 |
| local_irq_save() | 保存本地中断传递的当前状态,然后禁止本地中断传递 |
| local_irq_restore() | 恢复本地中断传递到给定的状态 |
| disable_irq() | 禁止本地中断线,并确保该函数返回之前在该中断线上没有处理程序在运行 |
| disable_irq_nosync() | 禁止给定中断线 |
| enable_irq() | 激活给定中断线 |
| irqs_disabled() | 如果本地中断线传递被禁止,则返回非0,否则返回0 |
| in_interrupt() | 如果在中断上下文中,则返回非0,如果在进程上下文中,则返回0 |
| in_irq() | 如果当前正在执行中断处理程序,则返回非0,否则返回0 |

浙公网安备 33010602011771号