2021-10-24

7.中断和中断处理

7.1 中断

中断是一个由硬件产生的电信号,先通过中断线传给中断处理器,中断控制器收到此硬件的中断信号之后会通过地址总线存入一个该设备的编号,表示这次中断需要关注的设备,在由中断处理器传信号给cpu,然后cpu从地址总线取出设备编号,通过编号找到中断向量所包含的中断服务的入口地址,压入 PC 寄存器,然后内核陷入一个中断处理程序ISR)来处理这个中断
不同的设备对应着不同的中断,不同的中断由叫中断请求线(IRQ)的值来唯一标识
异常和中断的区别:当执行代码时出现特殊情况:如错误指令,时,cpu会产生一个异常,通知内核处理,而中断来自处理器外部,而异常是执行某指令的结果

7.2 中断处理程序

程序通过特定代码去响应一个中断;
设备驱动程序:一个设备的中断处理程序,是对设备管理的内核代码;
linux中断处理程序就是C代码,运行于中断上下文中(原子上下文),中断处理程序有时间限制,还要通知硬件是否收到信号

7.3上半部和下半部

上半部指很迫切需要执行的代码,需要立即执行且有时间限制
下半部指允许稍后完成执行的代码
网络硬件的例子:网卡传中断信号给cpu,中断上半部需要立即复制网络数据包到系统内存,然后把控制权交给中断之前的代码,然后下半部再挑时机对数据包处理后再交给协议栈或应用程序

7.4 注册中断处理程序

request_irq()函数注册一个中断处理程序:
1.irq参数表示要分配的中断号
2.hander是一个指向处理函数的指针
3.flags参数可以为0或以下标志的位掩码:
·
IRQF_DISABLED
此参数表示不能同时运行两个同cpu的中断处理程序
·IRQF_SAMPLE_RANDOM:来自设备中断的间隔时间会作为熵值填充到内核熵池
·IRQF_SHARED:在多个处理程序之间共享中断线
4.name与中断设备关联的文本表示
5.dev参数用于区分共享中短线上的诸多处理程序
这个函数可能会睡眠,不能在不允许阻塞的函数中调用它
**free_irq()**删除指定的中断处理程序,如它所在的中断线上只有一个程序,则禁用此中断线
内核接受到中断时,检查此中断线上的每个程序

7.6 中断上下文

进程上下文:进程已执行过的字段/数据(存放在堆栈中),进程执行活动全过程的静态描述
中断上下文尽量节约时间和内存栈

7.9 中断控制

可禁止/激活整个处理器上所有的中断函数,或只禁止某一条中断线