首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux Irq domain

可以参考内核文档IRQ-domain.txt 为什么引入IRQ-Domain 当早期的系统只存在一个interrupt-controller的时候,而且中断数目也不多的时候,一个很简单的做法就是一个中断号对应到...interrupt-contoller的一个号,可以说是简单的线性映射 而当一个系统中有多个interrupt-controller的时候,而且中断号也逐渐增加。...linux内核为了应对此问题,引入了IRQ-domain的概念 irq-domain的引入相当于一个中断控制器就是一个irq-domain。就是一个中断区域。...而Hwirq-num就是dts中配置的irq号 而第一列就是对应的softirq-num,也就是request_irq时传入的irq 中断控制器级联的情况图 hwirq到softirq的映射 当开机之后...函数进行hwirq到softirq的map 首先dts中配置的中断号都是hwirq 刚开机hwirq没有对应的softirq的,所以第一次开机需要进行hwirq和softirq之间建立map int irq_domain_alloc_descs

1.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    5.分析内核中断运行过程,以及中断3大结构体:irq_desc、irq_chip、irqaction(详解)

    本节目标:    分析在linux中的中断是如何运行的,以及中断3大结构体:irq_desc、irq_chip、irqaction 在裸板程序中(参考stmdb和ldmia详解): 1.按键按下, 2....r5, lr   get_irqnr_and_base r0, r6, r5, lr // get_irqnr_and_base:获取中断号,r0=中断号...; 3).清中断 asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs) //irq:中断号...*regs:发生中断前的各个寄存器基地址 { struct pt_regs *old_regs = set_irq_regs(regs); /*根据irq中断号,找到哪个中断, *desc =irq_desc...根据中断号和desc,调用函数指针,进入中断处理, irq_finish(irq); irq_exit(); set_irq_regs(old_regs); } 上面主要是执行desc_handle_irq

    1.6K80

    Linux中断 - IDT

    中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux...int)regs->bp); #endif /* CONFIG_IA32_EMULATION */ } syscall_return_slowpath(regs); } 通过中断向量号...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int...pushq $(~vector+0x80) /* Note: always in signed byte range */ jmp common_interrupt 即先将中断号压栈...} exiting_irq(); set_irq_regs(old_regs); return 1; } 首先根据中断向量号获取到对应的中断描述符irq_desc,

    6.6K10

    Linux中断处理

    中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux对中断的处理过程。...,handler 的第一个参数是中断号,第二个参数是设备对应的ID,第三个参数是中断发生时由内核保存的各个寄存器的值。...(irq); // 注册proc文件系统 return 0; } setup_irq() 函数比较简单,就是通过 irq 号来查找对应的 irq_desc_t 结构,并把新的 irqaction...regs) { int irq = regs.orig_eax & 0xff; /* 获取IRQ号 */ int cpu = smp_processor_id(); irq_desc_t...return 1; } do_IRQ() 函数首先通过IRQ号获取到其对应的 irq_desc_t 结构,注意的是同一个中断有可能发生多次,所以要判断当前IRQ是否正在被处理当中(判断 irq_desc_t

    6.7K20

    韦东山:剥丝抽茧分析linux中断系统的重要数据结构

    最核心的结构体是irq_desc,之前为了易于理解,我们说在Linux内核中有一个中断数组,对于每一个硬件中断,都有一个数组项,这个数组就是irq_desc数组。...它就是个中转站,里面有irq_chip指针 irq_domain指针,都是指向别的结构体。 比较有意思的是irq、hwirq,irq是软件中断号,hwirq是硬件中断号。...比如上面我们举的例子,在GPIO中断B是软件中断号,可以找到irq_desc[B]这个数组项;GPIO里的第x号中断,这就是hwirq。 谁来建立irq、hwirq之间的联系呢?...比如GPIO控制器里有第1号中断,UART模块里也有第1号中断,这两个“第1号中断”是不一样的,它们属于不同的“域”──irq_domain。...但是我们在驱动中会使用request_irq(irq, handler)这样的函数来注册中断,irq是什么?它是软件中断号,它应该从“gpio1的第5号中断”转换得来。 谁把hwirq转换为irq?

    1.2K20

    聊聊 Linux 中断机制

    我没有查到中断到底是何时引入的,但是从 Linux 问世以来就已经有了,而且 Linux 是基于 UNIX 开发的,可以认为 UNIX 就已经引入中断机制了,而且换个角度来说,UNIX 作为如此著名的操作系统...根据中断号去 IDT(中断向量表)中取得中断向量并执行中断处理程序,处理完成后,CPU 会返回当前的任务继续执行。...在中断向量表中,中断向量号顺序排列,每个中断向量号占用 4 字节,因此每个中断向量的内存位置就是 [0x0000:N 乘 4,0x0000:N+1 乘 4 - 1) 。...在 Linux 系统中,将 int32 - int47 对应于 8259A 中断控制芯片发出的硬件中断请求信号 IRQ0 - IRQ15,并把程序编程发出的系统调用中断设置为 int128 ,也就是 0x80...下面是 8259A 芯片中断请求发出的中断号列表: 中断请求号 中断号 用途 IRQ0 0x20(32) 8253 发出的 100HZ 时钟中断 IRQ1 0x21(33) 键盘中断 IRQ2 0x22

    10210

    Linux系统驱动之两类中断控制器处理流程_链式和层级

    处理流程对比 在这里插入图片描述 参考资料: linux kernel的中断子系统之(七):GIC代码分析 Linux 4.9.88内核源码 Linux-4.9.88\drivers...它底下的4个中断触发时,都会导致GIC的33号中断被触发。 处理中断时,需要分辨:是谁触发了GIC 33号中断?这需要读取"chained intc"中的寄存器。...按下KEY时: 程序从GIC中读取寄存器知道发生了33号中断,通过GIC irq_domain可以知道virq为17 处理virq 17号中断:调用irq_desc[17].handle_irq...,确定是GPIO里2号引脚发生中断 通过GPIO irq_domain可以知道virq为102 处理virq 102号中断:调用irq_desc[102].handle_irq,即handleC...按下KEY时: 程序从GIC中读取寄存器知道发生了102号中断,通过GIC irq_domain可以知道virq为236 处理virq 236号中断:调用irq_desc[236].handle_irq

    1.1K41

    i.MX283开发板按键驱动和GPIO中断

    = 0;//中断号 2.中断服务函数  中断服务函数的入口参数和返回值都是有规定的,后面会介绍。...(IRQ_HANDLED); } 3.注册函数和注销函数 GPIO中断注册与注销主要需要以下几个函数,第一个是gpio_to_irq,这是一个宏定义,作用是申请中断号,只有申请了中断号,才可以进行后面的操作...ret; } /* irq:中断号 type:中断类型 */ 可配置的中断类型有以下几种: #define IRQ_TYPE_NONE 0x00000000 /* Default, unspecified...request_threaded_irq(irq, handler, NULL, flags, name, dev); } /* irq:中断号 handler:中断服务程序 flags:中断类型..., desc); } /* irq:中断号 dev_id:如果中断设置为共享(IRQF_SHARED)的话,此参数用来区分具体的中断。

    5400

    内核中断系统中的设备树

    #endif 9997: .endm linux-4.19-rc3\kernel\irq\handle.c e. handle_arch_irq的处理过程: 请看视频和图片 读取寄存器获得中断信息...使用irq_desc[virq].irq_data.chip的函数清中断 对于0号中断,加上一个或控制器,形成一个共享中断,可以控制网卡中断irq_net和摄像头中断irq_camera, 在0号中断上有两个设备...从中断号开始依次查找,直到找到最后空闲项, 如果bit=0则虚拟中断号就是2 虚拟中断号保存在irq_domain结构体中 irq_domain     linear_revmap[hwirq]...,…),中断号是通过宏方式进行定义的,所以直接使用中断号进行注册 如何使用新型中断号,注册irq 先在设备树中表明要使用那个中断,内核解析设备树时才会把这个中断号和某一个虚拟中断号挂钩,这些信息会转换成...-4.19-rc3.tar.gz 打上补丁: cd linux-4.19-rc3 patch -p1 linux-4.19-rc3_device_tree_for_irq_jz2440.

    1.2K31

    【汇编语言】内中断(二) —— 安装自己的中断处理程序:你也能控制0号中断

    编程处理0号中断 1.1 效果演示 现在我们考虑改变一下0号中断处理程序的功能,即重新编写一个0号中断处理程序,它的功能是在屏幕中间显示“overflow!”然后返回到操作系统,如下图所示。...当CPU 执行div bh后,发生了除法溢出错误,产生0号中断信息,引发中断过程,CPU 执行我们编写的0号中断处理程序。在屏幕中间显示提示信息“overflow!”后,返回到操作系统中。...1.2 分析所要编写的中断处理程序 1.2.1 引发中断 当发生除法溢出的时候,产生0号中断信息,从而引发中断过程。...,即do0 的代码,就变成了0号中断的中断处理程序。...答:将它的地址放入CS、IP 中; 那么,我们如何让一段程序成为N号中断的中断处理程序? 答:将它的入口地址放入中断向量表的N号表项中。 2.

    10210

    Linux驱动实践:一起来梳理【中断】的前世今生(附代码)

    目录 Linux 中断的知识点梳理 中断的分类 中断号和中断向量 中断服务程序ISR 上半部分和下半部分 中断处理的注册和注销 API 实操:捕获键盘中断 示例代码 驱动程序传参 IO编址:IO端口和IO...中断号和中断向量 这张图只要记住中断号与中断向量的关系就可以了: 中断号与中断控制器(PIC/APIC)相关; 中断向量与 CPU 相关,用来查找中断处理函数的入口地址; 中断服务例程 ISR 中断服务程序...(unsigned int irq, void *dev_id); 参数说明: irq: 硬件中断号; dev_id: 中断程序的唯一标识; 实操:捕获键盘中断 示例代码 有了上面的知识铺垫,下面就来实操一下.../module.h> #include linux/interrupt.h> // 中断号 static int irq; // 驱动程序名称 static char * devname;...向驱动程序传参 示例代码中,在调用 request_irq 时,需要指定中断号和驱动程序的名称。 这两个参数是在加载驱动模块的时候,从命令行传入的。

    1.2K30

    Linux系统GIC驱动程序分析

    GIC中断处理流程源码分析 参考资料: linux kernel的中断子系统之(七):GIC代码分析 Linux 4.9.88内核源码 Linux-4.9.88\drivers\irqchip...\irq-gic.c Linux-4.9.88/arch/arm/boot/dts/imx6ull.dtsi Linux 5.4内核源码 Linux-5.4\drivers\irqchip\irq-gic.c...假设要使用UART模块,它发出的中断连接到GIC的32号中断,分配的irq_desc序号为16 在GIC domain中会记录(32, 16) 那么注册中断时就是:request_irq(16, ......发生UART中断时 程序从GIC中读取寄存器知道发生了32号中断,通过GIC irq_domain可以知道virq为16 调用irq_desc[16]中的handleA函数,它的作用是调用action...按下KEY时: 程序从GIC中读取寄存器知道发生了33号中断,通过GIC irq_domain可以知道virq为16 调用irq_desc[16]中的handleB函数 handleB

    4.2K21

    Linux系统驱动之GIC驱动程序对中断的处理流程

    一级中断控制器处理流程 2. 多级中断控制器处理流程 参考资料: linux kernel的中断子系统之(七):GIC代码分析 使用逐步演进的方法才能形象地理解。 1....假设要使用UART模块,它发出的中断连接到GIC的32号中断,分配的irq_desc序号为16 在GIC domain中会记录(32, 16) 那么注册中断时就是:request_irq(16, ......发生UART中断时 程序从GIC中读取寄存器知道发生了32号中断,通过GIC irq_domain可以知道virq为16 调用irq_desc[16]中的handleA函数,它的作用是调用action...按下KEY时: 程序从GIC中读取寄存器知道发生了33号中断,通过GIC irq_domain可以知道virq为16 调用irq_desc[16]中的handleB函数 handleB...读取GPIO寄存器,确定是GPIO里2号引脚发生中断 通过GPIO irq_domain可以知道virq为102 调用irq_desc[102]中的handleA函数,它的作用是调用action链表中用户注册的函数

    2.2K20
    领券