(原创)第六章 中断和中断处理函数(Interrupts and Interrupt Handlers) Part1

一、注册中断处理函数

中断处理程序是管理硬件的驱动程序职责,每个设备都有与之对应的驱动,驱动注册中断处理函数。驱动可以注册中断处理程序并使能通过这个程序来处理的给定中断线。

int request_irq(unsigned int irq,
irqreturn_t (*handler)(int, void *,struct pt_regs *),
unsigned long irqflags,
const char *devname,
void *dev_id)


1、The first parameter, irq, 指定分配的中断号. 对于传统设备来说如System Timer等,IRQ是固定的,下表为PC中断的典型分配。

[table]
|PC IRQ-Table|
|0| System Timer
|1| Keyboard
|2| Switch to IRQ controller 2
|3| COM2, COM4
|4| COM1, COM3
|5| LPT2 / free
|6| Floppy
|7| LPT1, LPT3
|8| Real Time Clock
|9| Redirected IRQ 2
|10| free
|11| free
|12| PS/2 Mouse
|13| Math Co-Processor
|14| Primary IDE Controller
|15| Secondary IDE Controller
[/table]


2、The second parameter, handler, 指向服务该中断的中断处理程序的函数指针
3、The third parameter, irqflags, 为0或是下面bit mask标记中的一个或多个

[list]
[*]SA_INTERRUPT
[/list]
表示这个中断处理函数是一个快速中断处理程序。在历史上, Linux区分快速和慢速处理程序.在今天,两者唯一的区别在于:快速处理程序在运行时禁用所有中断,使其能够快速的执行完而不被可能的其他中断所打断;而慢速处理程序仅仅禁用
默认情况下(不使用这个标记),所有的中断都是启用的,除了任何当前正在运行的处理程序所在的中断线,它在所有的处理器上被掩码禁用掉。Sans the timer interrupt, most
interrupts do not want to enable this flag.
[list]
[*]SA_SAMPLE_RANDOM
[/list]

This flag specifies that interrupts generated by this device should contribute to the kernel entropy pool. The kernel entropy pool provides truly random numbers derived from various random events. If this flag is specified, the timing of interrupts from this device are fed to the pool as entropy. Do not set this if your device issues interrupts at a predictable rate (for example, the system timer) or can be influenced by external attackers (for example, a networking
device). On the other hand, most other hardware generates interrupts at nondeterministic times and is, therefore, a good
source of entropy. For more information on the kernel entropy pool, see Appendix B, "Kernel Random Number Generator."
[list]
[*]SA_SHIRQ
[/list]
这个标记表示这个中断线可以被多个中断处理程序共享。在给定的中断线上注册的每一个处理必须指定这个标记;否则每一个中断线上只能有一个处理程序。

4、The fourth parameter, devname, 关联到这个中断的设备的ASCII文字描述。这个文字名字由 /proc/irq 和 /proc/interrupts使用来和用户通信
5、The fifth parameter, dev_id, 主要用于共享中断线

返回值:
成功返回值为0.非零值表示错误,表示中断处理程序未能注册.通常错误是-EBUSY, 表示指定的中断线已经在使用(当前使用者或是你没有指定SA_SHIRQ).

[color=red][b]Note:[/b][/color]request_irq() 可能会sleep,因此不能在中断上下文或者其他代码不能够阻塞的环境中调用.当sleep是不安全的时候调用request_irq()是一个common misktake.

二、释放中断处理函数
卸载你的driver时,需要unregister中断处理程序并可能禁用该中端线. 调用下面方法实现
void free_irq(unsigned int irq, void *dev_id)


如果指定的中断线未共享,这个函数移出处理程序并禁用该中断线.如果中断线是共享的,则 被通过dev_id识别的处理程序被移除,但是中断线本身只有当最后一个处理程序被移除时才会被禁用。

对于共享中断线,需要一个唯一的cookie来区分可以在同一个地址线上存在的多个处理程序,并允许free_irq()仅仅移除正确的处理程序. 在任一情况下 (shared or unshared),如果dev_id非空,它必须和期望的处理程序匹配.

[color=red]对free_irq()的调用必须在进程上下文中完成.[/color]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值