您的位置:首页 > 运维架构 > Linux

Linux内核的中断机制

2016-02-28 14:50 375 查看
根据中断来源分为:内部中断(来自于CPU内部,如中断指令、溢出等)和外部中断(来自于外设,如读写完成中断)

根据是都可屏蔽分成:可屏蔽中断和不屏蔽中断(NMI),可屏蔽中断通过中断屏蔽字被屏蔽,屏蔽后,该中断不再的导向响应;不屏蔽中断不能被屏蔽。

根据中断入口跳转方法的不同,分成向量中断和非向量中断

采用向量中断的CPU通常给不同的中断号分配不同的中断号,当检查到某中断号的中断到来后,就自动跳转到与该中断号对应的地址执行。不同中断号的中断有不同的入口地址。非向量中断的多个中断共享一个入口地址,进入该入口地址后再通过软件判断中断标志来识别具体是哪个中断。也就是说,向量中断由硬件提供中断服务程序的入口地址,非向量中断由软件提供中断服务程序的入口地址。

定时器在硬件上也依赖中断实现,嵌入式可编程定时器(PIT)工作原理如下:

-----时钟输入--→预设计数值==?当前计数值-------Y-----→输出中断(并复位当前计数值变量)

工作原理:当定时器接收到一个时钟输入,当时钟脉冲到来时,将当前计数值+1并与预先设置的计数值(计数比较)比较,若相等,证明计数周期满,产生定时器中断并复位当前计数值。

Linux中断处理程序架构

设备的中断会打断内核中进程的正常调度和运行。

Linux内核的中断机制:为了在中断执行时间尽可能段和中断处理完成大量工作之间找到一个平衡点,Linux将中断处理程序分成两个半部,顶半部(top half)和底半部(bottom half)。

中断-----→上半部(紧急的硬件操作)----调度------→下半部(延缓的耗时操作)

顶半部完成尽可能少的比较紧急的功能,往往只是简单读取寄存器的中断状态并清除中断标志后就进行“登记中断”的工作。“登记中断”意味着将底半部处理程序挂到该设备的底半部执行队列中。这样,顶半部执行的速度会很快,可以服务更多的中断请求。

所以底半部来完成中断时间的绝大多数任务(几乎是中断要做的所有事情),而且可以被新的中断的打断,这是底半部和顶半部最大的区别,因为顶半部往往设计成不可中断。底半部一般不再硬件中断服务程序中执行。但是也不能僵化的认为Linux设备的驱动程序一定就是分成两部分,要是中断要处理的工作本身很少,则完全可以直接在顶半部全部完成。

Linux中断编程

中断申请(申请IRQ)-----request_irq()

释放IRQ------free_irq()

使能和屏蔽IRQ

disable_irq()       disable_irq_nosync()     enable_irq()

底半部机制:Linux实现底半部机制主要方式有   tasklet 工作队列  软中断
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: