在linux中,中断是硬件在需要的时候向CPU发出信号,CPU暂时停止正在进行的工作,来处理硬件请求的一种机制。当硬件忙碌的时候,CPU很可能会做许多无用功(每次轮询都是跳过不处理);所以为了提高CPU和外围硬件(硬盘,键盘,鼠标等等)之间协同工作的性能,引入了中断的机制。
本教程操作环境:linux7.3系统、Dell G3电脑。
中断是硬件在需要的时候向CPU发出信号,CPU暂时停止正在进行的工作,来处理硬件请求的一种机制。
具体说:
中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。
1.没有中断的话,CPU和外围设备之间协同工作/通信可能只有轮询这个方法:CPU定期检查硬件状态,需要处理时就处理,否则就跳过。
2.处理器的速度跟外围的硬件设备不在一个数量级上,因此提供一种机制让硬件在需要的时候向内核发出信号。
轮询的缺点/引入中断机制:
当硬件忙碌的时候,CPU很可能会做许多无用功(每次轮询都是跳过不处理)。
所以,为了提高CPU和外围硬件(硬盘,键盘,鼠标等等)之间协同工作的性能,引入了中断的机制。
中断: 硬件/进程发,内核收 信号:内核发,进程收,或者进程发进程收
中断是异步发生的,是来自处理器外部的I/O设备的信号的结果 1. 硬件中断不是由任何一条专门的指令造成的,从这个意义上来说它是异步的 2. 硬件中断的异常处理程序常常被称为中断处理程序(interrupt handler)
下图概述了一个中断的处理。
图8.5
I/O设备,例如络适配器、磁盘控制器和定时器芯片,通过向处理器芯片上的一个管脚发信号,并将异常号放到系统总线上,来触发中断,这个异常号标识了引起中断的设备。
在当前指令完成执行之前,处理器注意到中断管脚的电压变高了,就从系统总线读取异常号,然后调用适当的中断处理程序。当处理程序返回时,它就将控制返回给下一条指令(也就是,如果没有发生中断,在控制流中会在当前指令之后的那条指令)。结果是程序继续执行,就好像没有发生过中断一样。
剩下的异常类型(陷阱、故障和终止)是同步发生的,是执行当前指令的结果 我们把这类指令叫做故障指令(faulting instruction)
中断本质是一种特殊的电信号
处理过程:
中断由硬件设备生成,并直接送入中断控制器(简单的电子芯片)的输入引脚中,中断控制器采用复用技术将多路中断管线只通过一个和处理器相连接的管线与处理器通信。处理器一经检测到此信号,便中断自己的当前工作转而处理中断。硬件设备生成中断的时候并不考虑与处理器的时钟同步,即中断随时可以产生,因此内核随时可能因为新到来的中断而被打断。
Linux中通常分为外部中断(又叫硬件中断)和内部中断(又叫异常)。
同步中断(异常/内部中断):同步中断由CPU本身产生,又称为内部中断或异常
CPU在执行一条指令时,如果发现他要访问的页(虚拟地址的页)没有在物理内存中,那么停止该指令的执行,并产生一个页不存在的异常
一个可执行文件可能很大,放在磁盘上,一次只将其中一部分读进内存(cpu局部性原理),
当他要访问剩余内容时,会产生缺页中断,这时候再去从磁盘上换进来
异步中断(中断/外部中断):异步中断是由外部硬件设备产生,又称为外部中断或中断
当网卡接受到数据包时,通知内核,触发中断,所谓的上半部就是,及时读取数据包到内存,防止因为延迟导致丢失,这是很急迫的工作。
读到内存后,对这些数据的处理不再紧迫,此时内核可以去执行中断前运行的程序,而对网络数据包的处理则交给下半部处理。
异常与中断不同,中断是由硬件引起的;
异常则发生在编程失误而导致错误指令,或者在执行期间出现特殊情况必须要靠内核来处理的时候(比如缺页)。它在产生时必须考虑与处理器时钟同步,因此异常也称同步中断。
中断处理程序运行需要快速执行(因为不可阻塞),同时要能完成尽可能多的工作,这里存在矛盾。
因此把中断处理切分为两个部分,上半部分(top half)接收到一个中断后立即执行,但是只做有严格时限的工作,例如对接收到的中断进行应答或复位硬件。能够被允许稍后完成的工作会推迟到下半部分(bottom half)去,此后在合适的时机下半部分会被中断执行,Linux提供了实现下半部分的各种机制。
优点:这种设计可以使系统处于中断屏蔽状态的时间尽可能的短,以此来提高系统的响应能力。
中断处理程序是上半部——接受中断,他就立即开始执行,但只有做严格时限的工作。
上半部简单快速,执行时禁止一些或者全部中断。
工作内容:处理紧急功能,取寄存器状态。
能够被允许稍后完成的工作会推迟到下半部去,此后,在合适的时机,下半部执行
工作内容:完成中断事件绝大多数任务。
下半部稍后执行,而且执行期间可以响应所有的中断。
下半部的实现有软中断实现, tasklet 实现和工作队列实现。
1) 如果一个任务对时间非常敏感,将其放在中断处理程序中执行; 2) 如果一个任务和硬件有关,将其放在中断处理程序中执行; 3) 如果一个任务要保证不被其他中断打断,将其放在中断处理程序中执行; 4) 其他所有任务,考虑放置在下半部执行
当网卡接受到数据包时,通知内核,触发中断,所谓的上半部就是,及时读取数据包到内存,防止因为延迟导致丢失,这是很急迫的工作。
读到内存后,对这些数据的处理不再紧迫,此时内核可以去执行中断前运行的程序,而对网络数据包的处理则交给下半部处理。
中断对应着一个中断号,内核通过这个中断号查找相应的中断服务程序。
每个中断都通过一个唯一的数字标志,这样操作系统才能够给不同的中断提供对应的中断处理程序。
这些中断值即中断请求线,例如IRQ 0是时钟中断、IRQ 1是键盘中断。对于连接在PCI总线上的设备而言,中断请求线是动态分配的。
中断服务程序不在进程上下文中执行,而是在一个与所有进程都无关的、专门的中断上下文中运行,以此保证中断服务程序能够在第一时间响应和处理中断请求,然后快速地退出。
处理器在任何指定时间点上的活动必然属于以下三种情况之一:
运行于用户空间,执行用户进程; 运行于内核空间,处于进程上下文,代表某个特定的进程执行; (CPU空闲时,内核执行空进程) 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断;
相关推荐:《Linux视频教程》
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!