linux 中断系统 Linux修改时间
linux中断子系统 - linux 中断处理流程
当硬件触发中断时,中断信号直接导致处理器执行跳转至中断向量表,进入中断模式(IRQ模式),随后再次跳转至系统模式(svc模式),进行具体的中断处理操作。这一系列模式转换和现场保存操作主要由晦涩难懂的汇编代码实现。在做好必要的准备工作后,调用`handle_arch_irq`函数,最终进入C语言环境进行中断处理。
解释`handle_arch_irq`函数,这是一个平台相关的函数指针。通过`set_handle_irq`函数将其设置为`gic_handle_irq`。在中断发生后,中断处理流程会调用`gic_handle_irq`函数。
`gic_handle_irq`函数包含关键代码逻辑,处理三种类型中断:软件触发中断(SGI)、硬件触发中断(PPI)、以及外部硬件中断(SPI)。SGI用于CPU之间的通信,PPI是CPU独立触发的,典型例子是时钟中断,而SPI是最常见的外部中断。
SGI中断处理相对简单,仅涉及软件处理。PPI和SPI中断则需要考虑GIC的级联问题。系统中存在多个GIC时,需要递归处理。对于PPI和SPI,它们共享处理部分,但SPI处理需要考虑GIC的级联,而PPI处理直接进入SPI处理框架。
中断源信息记录在GIC的`GIC_CPU_INTACK`寄存器中,包括CPU ID和中断ID。SGI中断中CPU ID具有意义,而PPI/SPI中断中CPU ID无意义,仅读取低10位获取hwirq。
在处理中断号时,代码执行在一个死循环中,确保中断处理过程中产生的额外中断可以立即处理,而无需重新跳转至中断向量表。当从`GIC_CPU_INTACK`读取的中断号大于等于1020时,中断处理退出。
处理外设中断如PPI和SPI,调用`handle_domain_irq`函数,传入当前GIC所属domain、hwirq以及pt_regs。内核中存在中断编号(irq),与GIC的interrupt ID不同,存在映射关系,由domain保存。
进一步调用`__handle_domain_irq`函数处理中断,涉及设置中断状态、跳转至中断处理程序、执行软中断和退出中断环境等步骤。中断状态位在进入中断处理阶段时被设置,而非中断结束时。在特定条件下,中断环境会通过`tick broadcast`更新`jiffies`以防止软中断唤醒的误判。
通用中断处理函数`generic_handle_irq`实现核心处理逻辑,通过`irq_to_desc`获取中断描述信息,调用`desc->handle_irq()`回调函数进行处理。
中断回调函数`handle_fasteoi_irq`处理共享中断和级联中断,确保正确执行中断处理程序并进行中断线程化。对于SGI中断,处理流程直接进入IPI中断的特定处理。
IPI中断的响应与触发机制涉及GIC驱动初始化代码中的`set_smp_cross_call`函数,用于配置发送SGI中断的机制。例如,发送唤醒IPI中断时,调用路径涉及`arch_send_wakeup_ipi_mask`、`__smp_cross_call`,最终调用`gic_raise_softirq`函数。
中断处理流程涉及多种中断类型和机制,包括硬件触发、软件触发、级联处理、中断线程化等,确保系统能够高效响应中断,进行必要的操作并恢复至正常执行状态。
参考资料和链接提供进一步学习中断处理流程的资源。
什么是中断系统
问题一:什么是中断系统中断系统是计算机的重要组成部分。实时控制、故自动处理、计算机与外围设备间的数据传送往往采用中断系统。中断系统的应用大大提高了计算机效率。不同的计算机其硬件结构和软件指令是不完全相同的,因此,中断系统也是不相同的。计算机的中断系统能够加强CPU对多任务事件的处理能力。中断机制是现代计算机系统中的基础设施之一,它在系统中起着通信网络作用,以协调系统对各种外部事件的响应和处理。中断是实现多道程序设计的必要条件。中断是CPU对系统发生的某个事件作出的一种反应。引起中断的事件称为中断源。中断源向CPU提出处理的请求称为中断请求。发生中断时被打断程序的暂停点成为断点。CPU暂停现行程序而转为响应中断请求的过程称为中断响应。处理中断源的程序称为中断处理程序。CPU执行有关的中断处理程序称为中断处理。而返回断点的过程称为中断返回。中断的实现实行软件和硬件综合完成,硬件部分叫做硬件装置,软件部分称为软件处理程序。
问题二:什么是中断系统调用?中断、异常和系统调用
所谓中断是指CPU对系统发生的某个事件做出的一种反应,CPU暂停正在执行的程序,保留现场后自动地转去执行相应的处理程序,处理完该事件后再返回断点继续执行被“打断”的程序。
中断可分为三类,第一类是由CPU外部引起的,称作中断,如I/O中断、时钟中断、控制台中断等。第二类是来自CPU的内部事件或程序执行中的事件引起的过程,称作异常,如由于CPU本身故障(电源电压低于105V或频率在47~63Hz之外)、程序故障(非法操作码、地址越界、浮点溢出等)等引起的过程。
第三类由于在程序中使用了请求系统服务的系统调用而引发的过程,称作“陷入”(trap,或者陷阱)。前两类通常都称作中断,它们的产生往往是无意、被动的,而陷入是有意和主动的。
1.中断处理
中断处理一般分为中断响应和中断处理两个步骤。中断响应由硬件实施,中断处理主要由软件实施。
(1)中断响应
对中断请求的整个处理过程是由硬件和软件结合起来而形成的一套中断机构实施的。发生中断时,CPU暂停执行当前的程序,而转去处理中断。这个由硬件对中断请求作出反应的过程,称为中断响应。一般说来,中断响应顺序执行下述三步动作:
◆中止当前程序的执行;
◆保存原程序的断点信息(主要是程序计数器PC和程序状态寄存器PS的内容);
◆从中断控制器取出中断向量,转到相应的处理程序。
通常CPU在执行完一条指令后,立即检查有无中断请求,如果有,则立即做出响应。
当发生中断时,系统作出响应,不管它们是来自硬件(如来自时钟或者外部设备)、程序性中断(执行指令导致“软件中断”―Software Interrupts),或者来自意外事件(如访问页面不在内存)。
如果当前CPU的执行优先级低于中断的优先级,那么它就中止对当前程序下条指令的执行,接受该中断,并提升处理机的执行级别(一般与中断优先级相同),以便在CPU处理当前中断时,能屏蔽其它同级的或低级的中断,然后保存断点现场信息,通过取得的中断向量转到相应的中断处理程序的入口。
(2)中断处理
CPU从中断控制器取得中断向量,然后根据具体的中断向量从中断向量表IDT中找到相应的表项,该表项应是一个中断门。于是,CPU就根据中断门的设置而到达了该通道的总服务程序的入口。
核心对中断处理的顺序主要由以下动作完成:
◆保存正在运行进程的各寄存器的内容,把它们放入核心栈的新帧面中。
◆确定“中断源”或核查中断发生,识别中断的类型(如时钟中断或盘中断)和中断的设备号(如哪个磁盘引起的中断)。系统接到中断后,就从机器那里得到一个中断号,它是检索中断向量表的位移。中断向量因机器而异,但通常都包括相应中断处理程序入口地址和中断处理时处理机的状态字。
◆核心调用中断处理程序,对中断进行处理。
◆中断处理完成并返回。中断处理程序执行完以后,核心便执行与机器相关的特定指令序列,恢复中断时寄存器内容和执行核心栈退栈,进程回到用户态。如果设置了重调度标志,则在本进程返回到用户态时做进程调度。
2.系统调用
在Unix/Linux系统中,系统调用像普通C函数调用那样出现在C程序中。但是一般的函数调用序列并不能把进程的状态从用户态变为核心态,而系统调用却可以做到。
C语言编译程序利用一个预先确定的函数库(一般称为C库),其中有各系统调用的名字。C库中的函数都专门使用一条指令,把进程的运行状态改为核心态。Linux的系统调用是通过中断指令“INT 0x80”实现的。
每个系统调用都有惟一的号码,称作系统调用号。所有的系统调用都......>>
问题三:系统中断的定义系统中断,一般是硬件中断和软件中断的综合,“中断”是一个计算机术语,意思跟我们的请求差不多,鼠标、键盘、板卡或者是一些系统内核组件,要想为你服务,都要向系统提出申请,然后等待操作系统的分配。如果没有这个过程,你什么也干不了。CPU占用高的原因就是,系统要保持“随时”能为你提供服务,就必须保证它的优先权力。所谓中断是指CPU对系统发生的某个事件做出的一种反应,CPU暂停正在执行的程序,保留现场后自动地转去执行相应的处理程序,处理完该事件后再返回断点继续执行被“打断”的程序。中断可分为三类,第一类是由CPU外部引起的,称作中断,如I/O中断、时钟中断、控制台中断等。第二类是来自CPU的内部事件或程序执行中的事件引起的过程,称作异常,如由于CPU本身故障(电源电压低于105V或频率在47~63Hz之外)、程序故障(非法操作码、地址越界、浮点溢出等)等引起的过程。第三类由于在程序中使用了请求系统服务的系统调用而引发的过程,称作“陷入”(trap,或者陷阱)。前两类通常都称作中断,它们的产生往往是无意、被动的,而陷入是有意和主动的。
问题四:中断系统的功能当CPU响应某一中断时,若有优先权高的中断源发出中断请求,则CPU能中断正在进行的中断服务程序,并保留这个程序的断点(类似于子程序嵌套),响应高级中断,高级中断处理结束以后,再继续进行被中断的中断服务程序,这个过程称为中断嵌套。如果发出新的中断请求的中断源的优先权级别与正在处理的中断源同级或更低时,CPU不会响应这个中断请求,直至正在处理的中断服务程序执行完以后才能去处理新的中断请求。
问题五:什么是中断? 1、中断定义
CPU在执行一个程序时,对系统发生的某个事件(程序自身或外界的原因)作出的一种反应:CPU暂停正在执行的程序,保留现场后自动转去处理相应的事件,处理完该事件后,到适当的时候返回断点,继续完成被打断的程序。(如有必要,被中断的程序可以在后来某时间恢复,继续执行。)
事件:如读盘,盘有问题,无法读,产生中断,解决后,程序恢复,软件错误也会中断。特点:1)中断随机的
2)中断是可恢复的
3)中断是自动进行处理的
2、中断系统的有关概念
中断由软件(操作系统)、硬件协同完成,硬件机构称中断装置。
中断装置:指发现中断,响应中断的硬件。
中断处理程序是由软件来完成的。
以上合称中断系统
中断源:引起中断发生的事件
中断寄存器:硬件为每个中断源设置寄存器,中断发生时信息被记录在寄存器中,以便分析处理(记录中断)
中断字:中断寄存器中的内容
程序状态字:控制指令执行顺序,并保留和指示与程序相关的系统状态。
基本内容
程序基本状态(指令地址,条件码,目态/管态,等待计算)
中断码:保存程序执行时,当前发生的中断事件,以便操作系统分析处理(设置中断码)
中断屏蔽位
程序状态字寄存器(CPU按照其内容执行)
系统堆栈:在内存开辟的一块区域用来临时保存进程运行现场
问题六:计算机原理与应用什么是中断系统实现的功能 4.1指令系统的发展与性能要求
从计算机组成的的层次结构来说,计算机的指令有微指令、机器指令和宏指令等。机器指令则介于微指令与宏指令之间,通常简称为指令。每一条指令可完成一个独立的算术运算或逻辑运算*作。
一台计算机中所有机器指令的***,称为这台计算机的指令系统。
系统计算机:是指基本指令系统相同、基本体系结构相同的一系列计算机。
CISC:复杂指令系统计算机 RISC:简单指令系统计算机
一个完善的指令系统应满足四方面的要求:1、完备性 2、有效性 3、规整性 4、兼容性
高级语言与计算机的硬件结构及指令系统无关,汇编语言计算机的硬件结构和指令系统。不同的机器有不同的指令,所以用汇编语言编写的程序不能在其他类型的机器上运行。
4.2指令格式
机器指令是用机器字来表示的,表示一条指令的机器字,就称为指令,通常称为指令。
指令格式,则是指令字用二进制代码表示的结构形式,通常由*作码字和地址字段组成。
指令的*作码表示该指令应进行什么性质的*作,组成*作友字段的位数一般取决于计算机指令系统的规模,较大的指令系统就需要更多的位数来表示每条特定的指令。一般说来,一个包含n位的*作码最多能够表示2^n条指令。
根据一条指令中有几个*作数地址,可将指令分为:零地址指令、二地址指令、三地址指令。
从*作数安放的位置来说:分为SS、RS、SR、RR型指令。
一个指令字中包含二进制的位数,称为指令字长度。
机器字长是指计算机能直接处理的二进制数据的位数,它决定了计算机的运算精度。机器字长通常与主存单元的位数一致,指令字长度等于机器字长度的指令,称为单字长指令。指令字长度等于半个机器字长度的指令,称为半字长指令。指令字长等于两个机器字长度的指令,称为双字长指令。
指令*作码通常有两种编码格式:固定格式,适用大中型计算机可变格式,适用于微型和小型计算机。
4.3指令和数据的寻址方式
在这里要区分指令和数据的寻址方式的区别。
指令寻址:指令寻址的方式有顺序寻址和跳跃寻址。顺序寻址一般为顺序执行程序,而跳跃指令则是执行了转移指令所致。
所谓*作数的寻址方式:就是形成*作数的有效地址的方法。
其有:隐含寻址、立即寻址、寄存器寻址、直接寻址、间接寻址、相对寻址方式、变址和基址寻址方式、复合寻址方式、块寻址方式、段寻址方式。
下面就主要的几个寻址方式做个说明。
间接寻址:是给存放*作数地址的存储单元地址。
相对寻址:把程序计数器PC的内容加上指令格式中的形式地址D而形成*作数的有效地址。
变址寻址和基址寻址:两者在指令格式上很类似。习惯上基址寻址中基值寄存器提供基准量而指令提供位移量。而变址寻址中变址寄存器提供修改量而指令提供基准量。
块寻址方式经常用于输入输出指令中,以实现外存储器或外围设备同内存之间数据块传送,块寻址方式在内存中还可用于数据块搬家。
4.4堆栈寻址
堆栈用在主存储器和寄存器中。
串联寻址:由寄存器中给出。
堆栈原则:先进后出、后进先出。
堆栈*作:
入栈*作:先进入,后修改计数器。
出栈*作:先修改计数器,后跳出堆栈。
五章中央处理器
5.1中央处理器的功能和组成
CPU的四个功能:指令控制、*作控制、时间控制、数据加工。
中央处理器由两个主要部分组成:控制器和运算器。
控制器功能有:1、从内存中取出一条指令,并指出下一条指令在内存......>>
问题七:中断系统的功能? 5分中断技术是十分重要而复杂的技术,由计算机的软硬件共同完成,称之为中断系统。80486系统中的中断技术由CPU的中断管理机制、可编程中断控制器8259A和中断处理程序共同实现。一个完整的中断系统应具备如下功能。
①设置中断源:中断源是系统中允许请求中断的事件。设置中断源就是确定中断源的中断请求方式。
②中断源识别:当中断源有请求时,CPU能够正确地判别中断源,并能够转去执行相应的中断服务子程序。
③中断源判优:当有多个中断源同时请求中断时,系统能够自动地进行中断优先权判断,优先权最高的中断请求将优先得到CPU的响应和处理。
④中断处理与返回:能自动地在中断服务子程序与主程序之间进行跳转,并对断点进行保护。
问题八:什么是中断?简述中断处理过程中断就是执行中断服务程序,这是中断系统的核心。不同计算机系统的中断处理过程各具特色,但对多数计算机而言,其中中断服务程序的流程如下。
中断处理过程基本上由3部分组成,第一部分为准备部分,其基本功能是保护现场,对于非向量中断方式则需要确定中断源,最后开放中断,允许更高级的中断请求打断低级的中断服务程序;第二部分为处理部分,即真正执行具体的为某个中断源服务的中断服务程序;第三部分为结尾部分,首先要关中断,以防止在恢复现场过程中被新的中断请求打断,接着恢复现场,然后开放中断,以便返回原来的程序后可响应其他的中断请求。中断服务程序的最后一条指令一定是中断返回指令。
问题九:单片机的中断系统是什么?求详细的回答,谢谢中断装置和中断处理程序统称为中断系统。
中断系统是计算机的重要组成部分。实时控制、故障自动处理、计算机与外围设备间的数据传送往往采用中断系统。中断系统的应用大大提高了计算机效率。
不同的计算机其硬件结构和软件指令是不完全相同的,因此,中断系统也是不相同的。计算机的中断系统能够加强CPU对多任务事件的处理能力。中断机制是现代计算机系统中的基础设施之一,它在系统中起着通信网络作用,以协调系统对各种外部事件的响应和处理。中断是实现多道程序设计的必要条件。中断是CPU对系统发生的某个事件作出的一种反应。引起中断的事件称为中断源。中断源向CPU提出处理的请求称为中断请求。发生中断时被打断程序的暂停点成为断点。CPU暂停现行程序而转为响应中断请求的过程称为中断响应。处理中断源的程序称为中断处理程序。CPU执行有关的中断处理程序称为中断处理。而返回断点的过程称为中断返回。中断的实现实行软件和硬件综合完成,硬件部分叫做硬件装置,软件部分成为软件处理程序。
Linux内核中断上半部处理程序
硬件中断--异步中断中断本质上是一种电信号,由硬件设备发出,用于通知处理器特定事件。不同设备对应不同中断,每个中断通过唯一的数字标识,称为中断请求(IRQ)线。处理器内部对其编号,也称为中断号。
异常--同步中断异常不同于中断,产生时必须考虑与处理器时钟同步。异常常称为同步中断,是处理器执行时由于编程失误而导致的错误指令(如除0),或者执行期间出现特殊情况(如缺页),必须靠内核来处理时,处理器就会产生一个异常。我们通常所说的是中断,是指由硬件产生的异步中断。
软中断工作方式类似于异步中断,区别是它是通过软件引起的中断,异步中断是由硬件引起的。
中断处理程序中断处理程序(interrupt handler)或中断服务例程(interrupt service routine,ISR)响应一个特定中断时执行的函数。设备产生的每个中断,都有一个中断处理程序关联。一个设备可能产生多种不同的中断,那么该设备就可以对应多个中断处理程序。相应地,设备驱动程序就需要准备多个这样的函数。
Linux中断处理程序特点 Linux中,中断处理程序看起来像普通C函数,按特定类型声明,以便内核能以标准的方式传递处理程序的信息。中断处理程序与其他内核函数的区别:中断处理程序是被内核调用来响应中断的,而它们运行于被称为中断上下文的特殊上下文中。由于中断随时可能产生,因此中断处理程序必须随时、尽快执行,这样才能尽快响应中断,同时恢复中断代码的执行。
上下半部的对比一般把中断处理切分为2个部分或两半:1)上半部(top half)中断处理程序是上半部,接收到一个中断,就立即开始执行,但只做严格时限的工作。如对接收中断进行应答或复位硬件,这些工作都是在所有中断被禁止的情况下完成的。2)下半部(bottom half)中断处理程序中,能被允许稍后完成的工作会推迟到下半部。Linux提供下半部的各种机制。
编写中断处理程序一个典型的中断处理程序声明:其签名必须与request_irq()中参数handler所要求函数类型一致。参数说明:返回值:返回值是一个特殊类型:irqerturn_t。实际是int类型,为了与早期内核兼容,因为2.6以前实际是void类型。可能返回2个特殊值:IRQ_NONE和IRQ_HANDLED。当中断处理程序检测到一个中断,但该中断并非注册处理函数时指定的产生源时,返回IRQ_NONE;当中断处理程序被正确调用,而且确实是它所对应的设备产生的中断时,返回IRQ_HANDLED。返回值也可以用宏IRQ_RETVAL(x):x为非0,宏返回IRQ_HANDLED;x为0,返回IRQ_NONE。定义说明:中断处理程序通常标记为static,因为从来不会在其他文件被直接调用。可重入性 Linux中中断处理程序无需重入。当一个给定的中断处理程序正在执行时,相应的中断线在所有处理器上都会被屏蔽,以防在同一个中断线上接收另一个新的中断。也就是说,同一个中断线,同一个中断处理程序,在执行完毕之前不可能同时在2个处理器上执行,加上中断处理程序不能休眠,因此无需考虑可重入性。
中断控制 Linux内核提供一组接口用于操作机器上的中断状态:能用于禁止当前处理器的中断系统,屏蔽整个机器的一条中断线。例程与体系结构相关,位于。
禁止内核抢占:preempt_disable、preempt_enable等;禁止和激活中断用于禁止当前处理器上的本地中断,随后由激活:。由于flags包含具体体系结构的数据,即中断系统的状态,因此,flags不能传递给另一个函数,必须驻留在同一栈帧中。基于此,local_irq_save和restore的调用必须在同一个函数中。
中断系统的状态如何了解中断系统的状态,如中断当前是禁止的还是激活的?或者当前是否正处于中断上下文的执行状态中?本小节提供这方面回答。中 irqs_disable()如果本地处理器上的中断系统被禁止,则返回非0;否则,返回0。中 in_interrupt()如果内核处于中断上下文,则返回非0;如果在进程上下文,返回0。in_irq()如果当前正在执行中断处理程序,则返回非0;否则,返回0.
中断处理机制的实现中断处理系统的实现依赖于体系结构。中断的入口点是:硬件产生了中断,处理器开始跳转到对应的一个唯一位置,在栈中保存这个号,并存放当前寄存器的值(被中断任务),开始处理中断。中断产生到内核处理中断的步骤:1)硬件产生中断。2)处理器跳转到中断向量表对应的中断处理程序,栈中保存中断号及打断任务保存线程。3)内核调用do_IRQ()。之后,大多数中断处理代码用C编写。do_IRQ()提取中断号,对应x86代码:计算出中断号后,do_IRQ()对所接收的中断进行应答,禁止这条线上的中断传递。这些操作通过调用mask_and_ack_8259A()来完成。4)处理中断如果中断线上已安装中断处理程序,就调用handle_IRQ_event()处理;如果没有,就直接调用ret_from_intr(),返回内核运行中断的代码。x86上,handle_IRQ_event():5)调用ret_from_intr()类似于初始入口代码,用汇编编写。用于检查重新调度释放正在挂起(意味着设置了need_resched)。如果重新调度正在挂起,并且内核正在返回用户空间(i.e.中断了用户进程),那么schedule()被调用。如果内核正在返回内核空间(i.e.中断了内核本身),只有preempt_count(抢占计数器)为0时,schedule()才会被调用(否则,抢占内核便是不安全的)。schedule()返回后,或者如果没有挂起的工作,那么原来的寄存器被恢复,内核恢复到曾经中断的点。
/proc/interrupts查看中断统计信息 procfs是一个虚拟文件系统,只存在于内核内存,一般安装于/proc目录下。在procfs中读写文件都要调用内核函数,这些函数模拟从真实文件中读或写。/proc/interrupts文件存放系统中与中断相关的统计信息。
中断处理程序实例一个来自RTC驱动程序的中断处理程序,可在drivers/char/rtc.c中找到。RTC用于设置系统时钟,提供alarm或周期性定时器。