导航:首页 > 操作系统 > linux中断机制

linux中断机制

发布时间:2024-08-28 12:05:22

‘壹’ 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内核里,如果驱动在申请注册中断的时候没有特别的指定,do_irq在做中断响应的时候,是开启中断的,如果在驱动的中断处理函数正在执行的过程中,出现同一设备的中断或者不同设备的中断,这时候新的中断会被立即处理,还是被pending,等当前中断处理完成后,再做处理。在2.4和2.6内核里,关于这一块是否有什么不同。 一般申请中断的时候都允许开中断,即不使用SA_INTERRUPT标志。如果允许共享则加上 SA_SHIRQ,如果可以为内核熵池提供熵值(譬如你写的驱动是ide之类的驱动),则再加上 SA_SAMPLE_RANDOM标志。这是普通的中断请求过程。对于这种一般情况,只要发生中断,就可以抢占内核,即使内核正在执行其他中断函数。这里有两点说明:一是因为linux不支持 中断优先级,因此任何中断都可以抢占其他中断,但是同种类型的中断(即定义使用同一个 中断线的中断)不会发生抢占,他们会在执行本类型中断的时候依次被调用执行。二是所谓 只要发生中断,就可以抢占内核这句是有一定限制的,因为当中断发生的时候系统由中断门 进入时自动关中断(对于x86平台就是将eflags寄存器的if位置为0),只有当中断函数被执行 (handle_IRQ_event)的过程中开中断之后才能有抢占。 对于同种类型的中断,由于其使用同样的idt表项,通过其状态标志(IRQ_PENDING和 IRQ_INPROGRESS)可以防止同种类型的中断函数执行(注意:是防止handle_IRQ_event被重入, 而不是防止do_IRQ函数被重入),对于不同的中断,则可以自由的嵌套。因此,所谓中断嵌套, 对于不同的中断是可以自由嵌套的,而对于同种类型的中断,是不可以嵌套执行的。以下简单解释一下如何利用状态标志来防止同种类型中断的重入:当某种类型的中断第一次发生时,首先其idt表项的状态位上被赋予IRQ_PENDING标志,表示有待处理。 然后将中断处理函数action置为null,然后由于其状态没有IRQ_INPROGRESS标志(第一次),故将其状态置上IRQ_INPROGRESS并去处IRQ_PENDING标志,同时将action赋予相应的中断处理函数指针(这里是一个重点,linux很巧妙的用法,随后说明)。这样,后面就可以顺利执行handle_IRQ_event进行中断处理,当在handle_IRQ_event中开中断后,如果有同种类型的中断发生,则再次进入do_IRQ函数,然后其状态位上加上IRQ_PENDING标志,但是由于前一次中断处理中加上的IRQ_INPROGRESS没有被清除,因此这里无法清除IRQ_PENDING标志,因此action还是为null,这样就无法再次执行handle_IRQ_event函数。从而退出本次中断处理,返回上一次的中断处理函数中,即继续执行handle_IRQ_event函数。当handle_IRQ_event返回时检查IRQ_PENDING标志,发现存在这个标志,说明handle_IRQ_event执行过程中被中断过,存在未处理的同类中断,因此再次循环执行handle_IRQ_event函数。直到不存在IRQ_PENDING标志为止。2.4和2.6的差别,就我来看,主要是在2.6中一进入do_IRQ,多了一个关闭内核抢占的动作,同时在处理中多了一种对IRQ_PER_CPU类型的中断的处理,其他没有什么太大的改变。这类IRQ_PER_CPU的中断主要用在smp环境下将中断绑定在某一个指定的cpu上。例如arch/ppc/syslib/open_pic.c中的openpic_init中初始化ipi中断的时候。 其实简单的说,中断可以嵌套,但是同种类型的中断是不可以嵌套的,因为在IRQ上发生中断,在中断响应的过程中,这个IRQ是屏蔽的,也就是这个IRQ的中断是不能被发现的。 同时在内核的临界区内,中断是被禁止的 关于do_IRQ可能会丢失中断请求:do_IRQ函数是通过在执行完handle_IRQ_event函数之后判断status是否被设置了IRQ_PENDING标志来判断是否还有没有被处理的同一通道的中断请求。 但是这种方法只能判断是否有,而不能知道有多少个未处理的统一通道中断请求。也就是说,假如在第一个中断请求执行handle_IRQ_event函数的过程中来了同一通道的两个或更多中断请求,而这些中断不会再来,那么仅仅通过判断status是否设置了IRQ_PENDING标志不知道到底有多少个未处理的中断,handle_IRQ_event只会被再执行一次。这算不算是个bug呢? 不算,只要知道有中断没有处理就OK了,知道1个和知道N个,本质上都是一样的。作为外设,应当能够处理自己中断未被处理的情况。不可能丢失的,在每一个中断描述符的结构体内,都有一个链表,链表中存放着服务例程序关于中断中使用的几个重要概念和关系: 一、基本概念 1. 产生的位置 发生的时刻 时序 中断 CPU外部 随机 异步 异常 CPU正在执行的程序 一条指令终止执行后 同步 2.由中断或异常执行的代码不是一个进程,而是一个内核控制路径,代表中断发生时正在运行的进程的执行 中断处理程序与正在运行的程序无关 引起异常处理程序的进程正是异常处理程序运行时的当前进程 二、特点 (2)能以嵌套的方式执行,但是同种类型的中断不可以嵌套 (3)尽可能地限制临界区,因为在临界区中,中断被禁止 2.大部分异常发生在用户态,缺页异常是唯一发生于内核态能触发的异常 缺页异常意味着进程切换,因此中断处理程序从不执行可以导致缺页的操作 3.中断处理程序运行于内核态 中断发生于用户态时,要把进程的用户空间堆栈切换到进程的系统空间堆栈,刚切换时,内核堆栈是空的 中断发生于内核态时, 不需要堆栈空间的切换 三、分类 1.中断的分类:可屏蔽中断、不可屏蔽中断 2.异常的分类: 分类 解决异常的方法 举例 故障 那条指令会被重新执行 缺页异常处理程序 陷阱 会从下一条指令开始执行 调试程序

‘叁’ linux系统中的中断指令是什么

什么是中断
Linux 内核需要对连接到计算机上的所有硬件设备进行管理,毫无疑问这是它的份内事。如果要管理这些设备,首先得和它们互相通信才行,一般有两种方案可实现这种功能:
轮询(polling) 让内核定期对设备的状态进行查询,然后做出相应的处理;中断(interrupt) 让硬件在需要的时候向内核发出信号(变内核主动为硬件主动)。
第一种方案会让内核做不少的无用功,因为轮询总会周期性的重复执行,大量地耗用 CPU 时间,因此效率及其低下,所以一般都是采用第二种方案 。
对于中断的理解我们先看一个生活中常见的例子:QQ。第一种情况:你正在工作,然后你的好友突然给你发送了一个窗口抖动,打断你正在进行的工作。第
二种情况:当然你有时候也会每隔 5 分钟就去检查一下 QQ
看有没有好友找你,虽然这很浪费你的时间。在这里,一次窗口抖动就可以被相当于硬件的中断,而你就相当于 CPU,你的工作就是 CPU
这在执行的进程。而定时查询就被相当于 CPU 的轮询。在这里可以看到:同样作为 CPU 和硬件沟通的方式,中断是硬件主动的方式,较轮询(CPU
主动)更有效些,因为我们都不可能一直无聊到每隔几分钟就去查一遍好友列表。
CPU
有大量的工作需要处理,更不会做这些大量无用功。当然这只是一般情况下。好了,这里又有了一个问题,每个硬件设备都中断,那么如何区分不同硬件呢?不同设
备同时中断如何知道哪个中断是来自硬盘、哪个来自网卡呢?这个很容易,不是每个 QQ 号码都不相同吗?同样的,系统上的每个硬件设备都会被分配一个
IRQ 号,通过这个唯一的 IRQ 号就能区别张三和李四了。
从物理学的角度看,中断是一种电信号,由硬件设备产生,并直接送入中断控制器(如
8259A)的输入引脚上,然后再由中断控制器向处理器发送相应的信号。处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断。此后,
处理器会通知 OS 已经产生中断。这样,OS
就可以对这个中断进行适当的处理。不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标识,这些值通常被称为中断请求线。

‘肆’ 《Linux设备驱动程序》(十六)-中断处理

设备与处理器之间的工作通常来说是异步,设备数据要传递给处理器通常来说有以下几种方法:轮询、等待和中断。

让CPU进行轮询等待总是不能让人满意,所以通常都采用中断的形式,让设备来通知CPU读取数据。

2.6内核的函数参数与现在的参数有所区别,这里都主要介绍概念,具体实现方法需要结合具体的内核版本。

request_irq函数申请中断,返回0表示申请成功,其他返回值表示申请失败,其具体参数解释如下:

flags 掩码可以使用以下几个:

快速和慢速处理例程 :现代内核中基本没有这两个概念了,使用SA_INTERRUPT位后,当中断被执行时,当前处理器的其他中断都将被禁止。通常不要使用SA_INTERRUPT标志位,除非自己明确知道会发生什么。

共享中断 :使用共享中断时,一方面要使用SA_SHIRQ位,另一个是request_irq中的dev_id必须是唯一的,不能为NULL。这个限制的原因是:内核为每个中断维护了一个共享处理例程的列表,例程中的dev_id各不相同,就像设备签名。如果dev_id相同,在卸载的时候引起混淆(卸载了另一个中断),当中断到达时会产生内核OOP消息。

共享中断需要满足以下一个条件才能申请成功:

当不需要使用该中断时,需要使用free_irq释放中断。

通常我们会在模块加载的时候申请安装中断处理例程,但书中建议:在设备第一次打开的时候安装,在设备最后一次关闭的时候卸载。

如果要查看中断触发的次数,可以查看 /proc/interrupts 和 /proc/stat。

书中讲述了如何自动检测中断号,在嵌入式开发中通常都是查看原理图和datasheet来直接确定。

自动检测的原理如下:驱动程序通知设备产生中断,然后查看哪些中断信号线被触发了。Linux提供了以下方法来进行探测:

探测工作耗时较长,建议在模块加载的时候做。

中断处理函数和普通函数其实差不多,唯一的区别是其运行的中断上下文中,在这个上下文中有以下注意事项:

中断处理函数典型用法如下:

中断处理函数的参数和返回值含义如下:

返回值主要有两个:IRQ_NONE和IRQ_HANDLED。

对于中断我们是可以进行开启和关闭的,Linux中提供了以下函数操作单个中断的开关:

该方法可以在所有处理器上禁止或启用中断。

需要注意的是:

如果要关闭当前处理器上所有的中断,则可以调用以下方法:

local_irq_save 会将中断状态保持到flags中,然后禁用处理器上的中断;如果明确知道中断没有在其他地方被禁用,则可以使用local_irq_disable,否则请使用local_irq_save。

locat_irq_restore 会根据上面获取到flags来恢复中断;local_irq_enable 会无条件打开所有中断。

在中断中需要做一些工作,如果工作内容太多,必然导致中断处理所需的时间过长;而中断处理又要求能够尽快完成,这样才不会影响正常的系统调度,这两个之间就产生了矛盾。

现在很多操作系统将中断分为两个部分来处理上面的矛盾:顶半部和底半部。

顶半部就是我们用request_irq来注册的中断处理函数,这个函数要求能够尽快结束,同时在其中调度底半部,让底半部在之后来进行后续的耗时工作。

顶半部就不再说明了,就是上面的中断处理函数,只是要求能够尽快处理完成并返回,不要处理耗时工作。

底半部通常使用tasklet或者工作队列来实现。

tasklet的特点和注意事项:

工作队列的特点和注意事项:

‘伍’ Linux下如何强制中断一个程序的执行(利用按键,而不是kill命令

Linux下强制中断一个程序的执行使用键盘按键可以有多种方法。

1、CTRL+C键,这相当于发送Terminal信息到当前的程序。比如下图,在通过find命令查找名称带3b76的文件,可以直接按ctrl+c键结束掉循环。

‘陆’ 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 中断验证中断调用流程。

文件: driversgpudrmridgesynopsysdw-hdmi.c

在中断处理函数 dw_hdmi_hardirq() 和中断处理线程函数 dw_hdmi_irq 中增加 mp_stack() 调用( 注:仅限于调试验证 )。

插入 HDMI 线,系统启动后,显示中断调用流程的日志如下:

阅读全文

与linux中断机制相关的资料

热点内容
如何用电脑设置校时服务器 浏览:558
安卓什么软件可以换铃声 浏览:562
如何解决解压馆的劣势 浏览:320
plc编程模块化 浏览:245
单片机寄存器地址 浏览:396
七猫免费小说缓存加密 浏览:29
天津保税仓有溯源码 浏览:332
安卓9开发版什么时候推送 浏览:61
程序员可以天天加班吗 浏览:499
垃圾压缩车品牌 浏览:555
自制搜索引擎pdf 浏览:76
触漫安卓手机怎么登苹果的号 浏览:320
银行app怎么收信用卡的钱 浏览:288
java十进制转十六进制算法 浏览:920
pos刷卡需要app认证怎么弄 浏览:252
快速配IP命令 浏览:829
小程序后台源码导入 浏览:920
苹果手机app上的未读怎么取消 浏览:514
蜻蜓fm导出文件夹 浏览:514
我的世界怎么弄人家的服务器 浏览:361