硬中断、软中断

来源:互联网 发布:新速特软件站 官网 编辑:程序博客网 时间:2024/04/30 05:55
   这篇文章介绍一下linux中向量中断、非向量中断、底半部机制、软中断、硬中断的内容,都是从网上搜过来的。
操作系统从用户态切换到内核态需要借助CPU 内部的软件中断。
向量中断:为不同的中断分配不同的中断号,进入不同的入口地址,入中地址由硬件提供;
非向量中断:同一个入口地址,进入后再由软件判断中断标志来识别具体哪个中断。
底半部机制
①tasklet:使用比较简单,只需要定义tasklet 及其处理函数并将两者关联。
   需要调度tasklet 的时候引用一个tasklet_schedule(&my_tasklet)函数就能使系统在适当的时候进行调度运行。
由于软中断必须使用可重入函数,设计上复杂度变高,如果应用不需要在多个CPU 上并行执行,没必要用软中断。
  a)一种类型的tasklet 只能运行在一个CPU 上,不能并行,只能串行执行。多个不同类型的tasklet 可以并行在多个CPU 上。
  b)软中断是静态分配的,在内核编译好之后,就不能改变。但tasklet 就灵活许多,可以在运行时改变(比如添加模块时)。
②工作队列:与tasklet 相似,先定义work_struct 与处理函数, INIT_WORK()实现两者的一个绑定。在顶半部中调用sschedule(&my_wq);
③软中断 
硬中断:外设的中断; 
软中断:通常是硬中断服务程序对内核的中断; 
信号:是内核对某个进程的中断。
软中断用softirq_action 表示,raise_softirq()触发软中断;
  a)产生后并不是马上执行,必须要等待内核的调度才能执行。软中断不能被自己打断,只能被硬件中断打断(上半部)。
  b)可以并发运行在多个CPU 上(即使同一类型的也可以)。软中断必须设计为可重入的函数(允许多个CPU 同时操作),因此也需要使用自旋锁来保护其数据结构。
   软中断和tasklet 运行于中断上下文,不可睡眠;工作队列运行于进程上下文,可以睡眠。

0 0
原创粉丝点击