第7章 中断和中断处理

第7章 中断和中断处理

异常和中断区别

异常称为是同步中断(系统出现编程失误的时候(除0,缺页操作),由系统发现并进行处理,是一种可控的,已经安排好的流程,所以必须考虑与处理器时钟同步),而中断来源于外设等硬件,是产生的硬件中断,系统无法得知何时产生,但必须立即处理,所以属于异步中断

上半部:尽可能负责响应硬件的中断请求(将硬件的缓冲数据及时读取,硬件复位等立即性操作,有严格时间要求),上半部是在所有中断禁止的情况下完成的,所以要保证精简,快!-----(linux中没有中断嵌套吗?

流程:request_irq()注册一个中断处理程序,目的(参数如下:):是分配中断号(连接的中断线),绑定中断处理程序函数指针,flag标志(是否禁用所有其他中断、内核熵池、定时器中断专用、多中断程序共享标志(多设备共享一个中断线(中断号)),名字,dev参数(用于指定唯一的共享中断线的设备号码,特定表示这个设备)

返回:0表示成功,非0表示中断线不可共享情况下的正在使用问题。

这个函数允许睡眠,即会引发阻塞(调用过程会使用kmalloc()动态分配内存,在这里可能会导致睡眠,所以要注意)

free_irq(中断号,dev设备号):删除中断线上的特定dev设备驱动程序,如果这是最后一个dev,则禁用该中断线。

中断处理程序(中断号,设备号):判断当前所对应设备是否产生中断,并进行处理 

重入和中断处理程序:linux中无需重入,当前中断线上只允许运行一个中断处理程序(不允许中断嵌套),不同中断线上的中断处理程序可以并行.

中断入口地址即为内核的处理函数地址,内核接收中断后,调用在该中断线上的所有中断处理程序(判断+运行上半部),确保该中断线上所有中断都能正常得到处理。

中断处理栈:每个处理器均安排一个,1页大小的中断栈。

总结中断机制:中断产生->进入处理器中断内核->do_IRQ()->判断该线上是否有中断处理程序->有则执行handle_IRQ_event()遍历所有该线上的中断服务程序,没有则ret_from_intr()返回中断(不执行操作)->最终运行完由中断态返回断点处。

设置关中断的粒度在绑定的时候就可以设置,但是也可以通过以下的方法来安排。

禁止或激活当前处理器的所有中断,local_irq_disable(),local_irq_enable();即设置当前处理器的某个管理中断的寄存器即可。

禁止整个系统中指定中断线的所有中断:disable_irq(中断号),disable_irq_nosync(中断号),enable_irq(中断号),synchronize_irq(中断号).各有各的作用,只是粒度更小。

可用irqs_disable()宏返回是否禁用了中断,in_interrupt()用以表示当前是否处于中断处理过程中(有中断在执行,要么执行上文,要么下文均会返回),in_irq()表示内核正在执行中断上文。总感觉这两个宏的实现是其他核上运行的进程予以检测的

总之,中断处理程序需要事先和中断线绑定,在中断发生的时候系统先判断中断产生的来源,之后再调用该源的中断处理程序,在中断程序运行过程中,可以指定是否关开中断以及确定中断关闭的粒度,并且调用宏来检测当前系统所处于的中断状态。linux中中断处理程序不允许被嵌套,一条中断线上只能运行一个中断服务程序,但是多处理机的情况下多中断线上的中断可以并发处理(但是得考虑到SMP访问共享数据的锁机制),如果当前所有处理机均到来不同中断线的中断信号怎办?答:保证中断线个数<处理机个数。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值