中断网络是芯片与外界通信的一个非常重要的通道,在所有芯片中都会较好的设计芯片的中断网络,为了更好的适配复杂的硬件中断网络,linux操作系统也开辟了独特的中断子模块完成常见芯片的中断体系管理。
由于中断学习设计到硬件和中断网络芯片的硬件知识,这一块内容首先要求必须针对某一块芯片的某一种硬件中断网络展开学习。需要掌握的知识包含硬件中断网络运作机理、硬件中断优先级和中断嵌套、linux中断网络处理流程、linux中断的管理方式、linux中断下半文处理流程。
linux中断网络学习处理蜗牛博客专题外,韦东山在讲解设备树的时候专门针对中断网络展开的内容讲解也非常不错。
1 中断硬件
平顶和边沿中断差异
NVIC和GIC中断控制器
中断嵌套
2 内核管理中断
中断控制器 domain
3 Linux处理中断的8个步骤
- 硬件产生中断信号。
- 硬件中断信号通过中断控制器(如8259A)传递给CPU的一个专用引脚。
- CPU检测到中断引脚上的信号,立即停止当前的执行,并将程序状态字(PSW)入栈,以便在中断处理结束后能正确恢复执行现场。
- CPU从中断控制器中读取中断向量,根据中断向量找到对应的中断处理程序(ISR)。中断处理过程可能涉及多级中断控制器,Linux内核通过domain方式来表示各个中断控制器,并根据中断号在其中寻找合适的中断处理函数。
- CPU执行ISR,执行必要的中断处理,然后执行清中断命令,确保硬件不会再产生新的中断信号。
- 如果有更复杂的中断处理需要在进程上下文中完成,ISR可能会触发软中断,将进一步的处理工作推后到下一个适当的时刻(例如下一次时钟中断)。
- 如果有必要,ISR可能会操作硬件,比如确认中断事件已经处理完毕,或者是清除硬件状态寄存器等。
- 执行完ISR后,CPU恢复之前保存的程序状态字和程序计数器(PC),恢复执行被中断打断的进程。
4 中断上下文
为了提高实时性,中断子系统中有一个重要的设计机制,那就是Top-half和Bottom-half
,将紧急的工作放置在Top-half
中来处理,而将耗时的工作放置在Bottom-half
中来处理,这样确保Top-half
能尽快完成处理。中断下半部实现方式分为:工作队列、tasklet和softirq。其中,软中断和tasklet都是运行在中断上下文中,它们与任一进程无关,没有支持的进程完成重新调度。所以软中断和tasklet不能睡眠、不能阻塞。简单地说,一般的驱动程序的编写者需要做两个选择。 首先,你是不是需要一个可调度的实体来执行需要推后完成的工作――从根本上来说,有休眠的需要吗?要是有,工作队列就是你的惟一选择。 否则最好用tasklet。要是必须专注于性能的提高,那么就考虑softirq。