中断号:在硬件上,中断源可以通过中断控制器向CPU提交中断,进而引发中断处理程序的执行,不过这种硬件中断体系每一种CPU都不一样,而Linux作为操作系统,需要同时支持这些中断体系,如此一来,Linux中就提出了软中断的概念,也有人叫内核中断,其本质就是使用统一的方式对不同硬件中断体系中的中断号进行再映射,在操作系统中操作的中断号都是这些映射过的软中断号。
1、 注册中断处理函数
int requst_irq(unsigned int irq,irq_handler_t handler, unsigned long flags, const char *name,void * dev_id);
irq//中断号
handler//中断处理函数
flags//中断标志位。flags取值在"interrupt.h"有定义,常用的有IRQF_DISABLED和IRQF_SHARED,前者表示中断程序调用时屏蔽所有中断,"所有"指的是屏蔽所有中断线的中断,本中断线的中断本来就是屏蔽的,内核默认不允许中断嵌套。IRQF_SHARED表示多个设备共享中断,即该中断线上连接了多个相同或不同的设备。
name//是中断名称,可以在/proc/interrupt中看到
dev_id//用于共享中断,用来标识是哪个设备触发了中断,通常传入相应设备的中断状态寄存器的地址或填NULL。
返回0表示注册中断成功。
2、 中断处理函数
static irqreturn_t intr_handler(int irq, void *dev);
dev//是一个通用指针,它与在注册中断处理函数中的dev_id必须一致。一般不会用。
3. 释放中断处理函数
void free_irq(unsigned int irqno,void * dev_id);
4.中断与核的绑定
https://blog.youkuaiyun.com/qq_35399548/article/details/118492860
中断号也是一种系统资源,使用完毕后要释放,注意,free_irq的第二个参数应当与request_irq()中最后一个参数相同,这样才能将这个handler从这个中断线中的handler链表中删除。
参考链接:https://www.cnblogs.com/xiaojiang1025/p/6388603.html
5.中断上半部与下半部
在中断处理程序中,既想让程序运行的快,又想让程序完成的工作量多,这两个目的有抵触。
鉴于这两个目的不可调和的矛盾,中断处理可以分为两部分:
中断处理工作,例如对接收中断进行中断或复位硬件,这些工作都在所有中断被禁止的情况下完成。可以稍后完成的工作推迟到下半部,在合适的情况下执行下半部分中断。
中断下半部:
下半部分执行的任务是执行与中断处理密切相关,但中断处理程序本身不执行的工作。和上半部分只能通过中断处理程序实现不同,下半部分可以通过多种机制实现。
一般硬中断基本为中断的上半部分,软中断和tasklet是中断的下半部分,将上半部分没有实现完的处理继续执行。
5.硬中断与软中断
硬中断是由硬件产生的。
硬中断:每个设备或设备集都有它自己的IRQ(中断请求)。
软中断:软中断是一些对I/O的请求。这些请求会调用内核中可以调度I/O发生的程序。
硬中断:
-
硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)。
-
处理中断的驱动是需要运行在CPU上的,因此,当中断产生的时候,CPU会中断当前正在运行的任务,来处理中断。在有多核心的系统上,一个中断通常只能中断一颗CPU(也有一种特殊的情况,就是在大型主机上是有硬件通道的,它可以在没有主CPU的支持下,可以同时处理多个中断。)。
-
硬中断可以直接中断CPU。它会引起内核中相关的代码被触发。对于那些需要花费一些时间去处理的进程,中断代码本身也可以被其他的硬中断中断。
-
对于时钟中断,内核调度代码会将当前正在运行的进程挂起,从而让其他的进程来运行。它的存在是为了让调度代码(或称为调度器)可以调度多任务。
软中断:
-
软中断的处理非常像硬中断。然而,它们仅仅是由当前正在运行的进程所产生的。
-
通常,软中断是一些对I/O的请求。这些请求会调用内核中可以调度I/O发生的程序。对于某些设备,I/O请求需要被立即处理,而磁盘I/O请求通常可以排队并且可以稍后处理。根据I/O模型的不同,进程或许会被挂起直到I/O完成,此时内核调度器就会选择另一个进程去运行。I/O可以在进程之间产生并且调度过程通常和磁盘I/O的方式是相同。
-
软中断仅与内核相联系。而内核主要负责对需要运行的任何其他的进程进行调度。一些内核允许设备驱动的一些部分存在于用户空间,并且当需要的时候内核也会调度这个进程去运行。
-
软中断并不会直接中断CPU。也只有当前正在运行的代码(或进程)才会产生软中断。这种中断是一种需要内核为正在运行的进程去做一些事情(通常为I/O)的请求。有一个特殊的软中断是Yield调用,它的作用是请求内核调度器去查看是否有一些其他的进程可以运行。
参考链接:
https://blog.youkuaiyun.com/xuchenhuics/article/details/7912064
https://blog.youkuaiyun.com/xuchenhuics/article/details/79120644