首页 > 其他分享 >中断处理机制解析

中断处理机制解析

时间:2023-11-13 23:01:31浏览次数:40  
标签:中断 irq handler IRQ 机制 解析 处理函数 desc

要处理中断,需要有一个中断处理函数。定义如下:

irqreturn_t (*irq_handler_t)(int irq, void * dev_id);


/**
 * enum irqreturn
 * @IRQ_NONE    interrupt was not from this device or was not handled
 * @IRQ_HANDLED    interrupt was handled by this device
 * @IRQ_WAKE_THREAD  handler requests to wake the handler thread
 */
enum irqreturn {
  IRQ_NONE    = (0 << 0),
  IRQ_HANDLED    = (1 << 0),
  IRQ_WAKE_THREAD    = (1 << 1),
};

其中,irq 是一个整数,是中断信号。dev_id 是一个 void * 的通用指针,主要用于区分同一个中断处理函数对于不同设备的处理。

这里的返回值有三种:IRQ_NONE 表示不是我的中断,不归我管;IRQ_HANDLED 表示处理完了的中断;IRQ_WAKE_THREAD 表示有一个进程正在等待这个中断,中断处理完了,应该唤醒它。

很多中断处理程序将整个中断要做的事情分成两部分,称为上半部和下半部,或者成为关键处理部分和延迟处理部分。在中断处理函数中,仅仅处理关键部分,完成了就将中断信号打开,使得新的中断可以进来,需要比较长时间处理的部分,也即延迟部分,往往通过工作队列等方式慢慢处理。

有了中断处理函数,接下来要调用 request_irq 来注册这个中断处理函数。request_irq 有这样几个参数:

  • unsigned int irq 是中断信号;
  • irq_handler_t handler 是中断处理函数;
  • unsigned long flags 是一些标识位;
  • const char *name 是设备名称;
  • void *dev 这个通用指针应该和中断处理函数的 void *dev 相对应。

对于每一个中断,都有一个对中断的描述结构 struct irq_desc。它有一个重要的成员变量是 struct irqaction,用于表示处理这个中断的动作。每一个中断处理动作的结构 struct irqaction,都有以下成员:

  • 中断处理函数 handler;
  • void *dev_id 为设备 id;
  • irq 为中断信号;
  • 如果中断处理函数在单独的线程运行,则有 thread_fn 是线程的执行函数,thread 是线程的 task_struct。

在 request_threaded_irq 函数中,irq_to_desc 根据中断信号查找中断描述结构。如何查找呢?这就要区分情况。一般情况下,所有的 struct irq_desc 都放在一个数组里面,我们直接按下标查找就可以了。如果配置了 CONFIG_SPARSE_IRQ,那中断号是不连续的,就不适合用数组保存了。

真正中断的发生还是要从硬件开始。这里面有四个层次。

  • 第一个层次是外部设备给中断控制器发送物理中断信号。
  • 第二个层次是中断控制器将物理中断信号转换成为中断向量 interrupt vector,发给各个 CPU。
  • 第三个层次是每个 CPU 都会有一个中断向量表,根据 interrupt vector 调用一个 IRQ 处理函数。
  • 第四个层次是在 IRQ 处理函数中,将 interrupt vector 转化为抽象中断层的中断信号 irq,调用中断信号 irq 对应的中断描述结构里面的 irq_handler_t。

中断处理机制解析_中断处理

对于每一个 CPU,都要求有一个 idt_table,里面存放了不同的中断向量的处理函数。中断向量表中已经填好了前 32 位,外加一位 32 位系统调用,其他的都是用于设备中断。

硬件中断的处理函数是 do_IRQ 进行统一处理,在这里会让中断向量,通过 vector_irq 映射为 irq_desc。

irq_desc 是一个用于描述用户注册的中断处理函数的结构,为了能够根据中断向量得到 irq_desc 结构,会把这些结构放在一个基数树里面,方便查找。

irq_desc 里面有一个成员是 irqaction,指向设备驱动程序里面注册的中断处理函数。


标签:中断,irq,handler,IRQ,机制,解析,处理函数,desc
From: https://blog.51cto.com/key3feng/8355464

相关文章

  • v-model添加number修饰符,如果这个值无法被parseFloat()解析,则会返回原始的值。
    在默认情况下,v-model在每次input事件触发后将输入框的值与数据进行同步。你可以添加lazy修饰符,从而转为在change事件_之后_进行同步:如果想自动将用户的输入值转为数值类型,可以给v-model添加number修饰符:如果这个值无法被parseFloat()解析,则会返回原始的值。......
  • DNS——域名解析介绍
    认识DNS我们访问服务器最后都应该是一个IP地址假设我们要访问百度,我们只知道百度的域名时我们可以通过dns服务器进行解析,将www.baidu.com解析成IP地址www.baidu.com..根域.com顶级域.baidu二级域www主机名根域服务器只负责一个域名解析baidu.一级域只解析www.com.......
  • 【C++】【图像处理】均值滤波和高斯滤波(低通滤波)算法解析(以.raw格式的图像为基础进行
    1voidmeanFilter(BYTE*image,intwidth,intheight,BYTE*outImg)2{3//均值滤波4intsmth[9];5inti,j,m,n;6BYTEblock[9];78//高斯卷积核初始化9smth[0]=1,smth[1]=2,smth[2]=1,10smth[3]=2,......
  • 深入解析监控易产品架构
      在现代化的信息技术体系中,产品架构的设计和实施是实现高效运维的基石。一个精心设计和实施的产品架构不仅能够保证IT系统的稳定运行,还能够应对复杂多变的业务需求。本文将详细探讨监控易的产品架构,包括数据中台、功能应用层和展示层的设计与工作原理。数据中台  数据中台......
  • Android Binder机制简述
    Binder机制是Android系统提供的一种高级IPC机制,它使用代理对象、共享内存和序列化等技术,实现了进程间通信和远程调用的功能。它允许在不同进程之间进行数据传输和方法调用,实现了进程间的解耦。在Android系统中,Binder被广泛应用于各种组件之间的通信,例如Activity与Service、Service......
  • 异常处理机制(二)之异常捕获
    1.try…catch代码如下:单个捕获异常 如有异常会进入catch中输出异常!!!2.try…catch…catch多个捕获异常 进入异常代码块后try会终止运行3.try…catch…finally捕获异常并输出finally代码块 注:finally代码块只要不是系统异常终止都会运行4.try…finally代......
  • 异常处理机制(三)常见异常
    一、认识异常在Java中所有的异常(Exception)和错误(Error)都继承了同一个父类Throwable,他们的关系如下: 二、常见的运行时异常2.1空指针异常(NullPointerException):代码如下: 异常如下: 2.2数组下标越界异常(ArrayIndexOutOfBoundsException):代码如下: 异常......
  • 异常处理机制之throw与throws的区别是什么?(新手必看)
    ......
  • 异常处理机制(一)之throw与throws的区别是什么?
    throw与throws的区别一、throw:throw:抛出异常throw:代表动作,表示抛出一个异常的动作;throw:方法体内,可以作为单独语句使用throw:只能抛出一个异常对象throw是语句抛出一个异常,一般是在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常1.1声明格式: ......
  • 谈谈对ArrayList的理解以及扩容机制
     1.浅谈ArrayListArrayList类又称动态数组,同时实现了Collection和List接口,其内部数据结构由数组实现,因此可对容器内元素实现快速随机访问。但因为ArrayList中插入或删除一个元素需要移动其他元素,所以不适合在插入和删除操作频繁的场景下使用。ArrayList的容量可以随着元素的增......