linux中断函数(中断函数怎么执行的)
很多朋友对于linux中断函数和中断函数怎么执行的不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
Linux几种中断信号的区别:HUP,INT,KILL,TERM,TSTP
Linux的HUP,INT,KILL,TERM,TSTP中断信号区别为:键入不同、对应操作不同、启用不同。
一、键入不同
1、HUP中断信号:HUP中断信号是当用户键入<Ctrl+X>时由终端驱动程序发送的信号。
2、INT中断信号:INT中断信号是当用户键入<Ctrl+I>时由终端驱动程序发送的信号。
3、KILL中断信号:KILL中断信号是当用户键入<Ctrl+Z>时由终端驱动程序发送的信号。
4、TERM中断信号:TERM中断信号是当用户键入<Ctrl+\>时由终端驱动程序发送的信号。
5、TSTP中断信号:TSTP中断信号是当用户键入<Ctrl+T>时由终端驱动程序发送的信号。二、对应操作不同
1、HUP中断信号:HUP中断信号的对应操作为让进程挂起,睡眠。
2、INT中断信号:INT中断信号的对应操作为正常关闭所有进程。
3、KILL中断信号:KILL中断信号的对应操作为强制关闭所有进程。
4、TERM中断信号:TERM中断信号的对应操作为正常的退出进程。
5、TSTP中断信号:TSTP中断信号的对应操作为暂时停用进程。
三、启用不同
1、HUP中断信号:HUP中断信号发送后,可以重新被用户再次输入恢复启用进程。
2、INT中断信号:INT中断信号发送后,不可以重新被用户再次输入恢复启用进程。
3、KILL中断信号:KILL中断信号发送后,不可以重新被用户再次输入恢复启用进程。
4、TERM中断信号:TERM中断信号发送后,可以重新被用户再次输入启用进程。
5、TSTP中断信号:TSTP中断信号发送后,可以重新被用户再次输入继续使用进程。
linux系统中的中断指令是什么
什么是中断
Linux内核需要对连接到计算机上的所有硬件设备进行管理,毫无疑问这是它的份内事。如果要管理这些设备,首先得和它们互相通信才行,一般有两种方案可实现这种功能:
轮询(polling)让内核定期对设备的状态进行查询,然后做出相应的处理;中断(interrupt)让硬件在需要的时候向内核发出信号(变内核主动为硬件主动)。
第一种方案会让内核做不少的无用功,因为轮询总会周期性的重复执行,大量地耗用 CPU时间,因此效率及其低下,所以一般都是采用第二种方案。
对于中断的理解我们先看一个生活中常见的例子:QQ。第一种情况:你正在工作,然后你的好友突然给你发送了一个窗口抖动,打断你正在进行的工作。第
二种情况:当然你有时候也会每隔 5分钟就去检查一下 QQ
看有没有好友找你,虽然这很浪费你的时间。在这里,一次窗口抖动就可以被相当于硬件的中断,而你就相当于 CPU,你的工作就是 CPU
这在执行的进程。而定时查询就被相当于 CPU的轮询。在这里可以看到:同样作为 CPU和硬件沟通的方式,中断是硬件主动的方式,较轮询(CPU
主动)更有效些,因为我们都不可能一直无聊到每隔几分钟就去查一遍好友列表。
CPU
有大量的工作需要处理,更不会做这些大量无用功。当然这只是一般情况下。好了,这里又有了一个问题,每个硬件设备都中断,那么如何区分不同硬件呢?不同设
备同时中断如何知道哪个中断是来自硬盘、哪个来自网卡呢?这个很容易,不是每个 QQ号码都不相同吗?同样的,系统上的每个硬件设备都会被分配一个
IRQ号,通过这个唯一的 IRQ号就能区别张三和李四了。
从物理学的角度看,中断是一种电信号,由硬件设备产生,并直接送入中断控制器(如
8259A)的输入引脚上,然后再由中断控制器向处理器发送相应的信号。处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断。此后,
处理器会通知 OS已经产生中断。这样,OS
就可以对这个中断进行适当的处理。不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标识,这些值通常被称为中断请求线。
Linux内核中断之中断调用流程
本文基于 RockPI 4A单板Linux4.4内核介绍中断调用流程。
ARMv8包括两种运行状态:AArch64和AArch32。
AArch64中不再使用AArch32中的7种特权模式,而是提出了Exception Levels的概念,包括:
1)EL0:用于用户态程序,权限最低
2)EL1:给内核使用,权限稍高
3)EL2:虚拟化相关,权限更高
4)EL3:安全相关,权限最高
Linux内核中一般只使用EL0和EL1。
AArch64异常向量表中的异常包括:
1)Synchronous exception(同步异常)
2)SError
3)IRQ
4)FIQ
注:SError、IRQ和FIQ属于异步异常。
在Linux内核中,在 arch/arm64/kernel/entry.S文件中定义了异常向量表,内容如下:
选取 el1_irq()函数介绍Linux内核中断的调用流程。
文件: arch/arm64/kernel/entry.S,调用流程如下:
1、handle_irq()初始化
在 DTS解析阶段完成 handle_irq()函数的初始化,流程如下:
gic_irq_domain_map()函数中完成了 handle_irq()函数的赋值,具体执行如下:
2、handle_irq()实现
以共享外设中断 SPI的中断处理函数 handle_fasteoi_irq()为例,继续跟踪中断的执行过程。
handle_irq_event_percpu()函数会调用已经注册的中断处理函数,同时唤醒 irq_thread线程。
3、中断处理线程
在使用 request_threaded_irq()函数申请中断时,会创建一个 irq_thread线程,调用流程如下:
irq_thread线程平时在睡眠状态,等待 handle_irq_event_percpu()函数唤醒,进一步执行已注册的中断处理线程函数。
使用 DRM框架中 HDMI中断验证中断调用流程。
文件: drivers\gpu\drm\bridge\synopsys\dw-hdmi.c
在中断处理函数 dw_hdmi_hardirq()和中断处理线程函数 dw_hdmi_irq中增加 dump_stack()调用(注:仅限于调试验证)。
插入 HDMI线,系统启动后,显示中断调用流程的日志如下:
和