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 工作队列 软中断
根据是都可屏蔽分成:可屏蔽中断和不屏蔽中断(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 工作队列 软中断
相关文章推荐
- 文件查看命令
- Linux 内存机制原理物理内存,Cache化,Buffer,Swap关系
- Linux内核分析
- linux 在批处理中,完整路径有空格的处理方式(加引號)
- linux C宏定义实现打印调试信息
- Centos7安装配置vnc
- Linux下多目录的Makefile编写
- centos6.4的本地yum源配置
- linux中根据进程的PID值来查找执行文件的及其路径
- linux下查找包含关键字的文件
- [Linux]O_CLOEXEC 标志
- 使用Eclipse编译运行MapReduce程序 Hadoop2.6.0_Ubuntu/CentOS
- linux内存管理之初始化zonelists
- linux之ifconfig命令
- linux 进入救援模式
- Linux正则表达式――扩展篇
- java 项目linux下写入文件权限777
- linux知识复习一
- linux删除文件后没有释放空间
- 《Linux内核分析》-X86汇编基础及实验总结