Linux中断详解
中断与定时器
- 中断的概念:指CPU在执行过程中,出现某些突发事件急待处理,CPU暂停执行当前程序,转去处理突发事件,处理完后CPU又返回原程序被中断的位置继续执行
中断的分类:
- 内部中断:中断源来自CPU内部(软件中断指令、溢出、触发错误等)
- 外部中断:中断源来自CPU外部,由外设提出请求
屏蔽中断和不可屏蔽中断:
- 可屏蔽中断:可以通过屏蔽字被屏蔽,屏蔽后,该中断不再得到响应
- 不可平布中断:不能被屏蔽
向量中断和非向量中断:
- 向量中断:CPU通常为不同的中断分配不同的中断号,当检测到某中断号的中断到来后,就自动跳转到与该中断号对应的地址执行
- 非向量中断:多个中断共享一个入口地址。进入该入口地址后再通过软件判断中断标志来识别具体哪个是中断也就是说向量中断由软件提供中断服务程序入口地址,非向量中断由软件提供中断入口地址
(典型的非向量中断首先会判断中断源,然后调用不同中断源的中断处理程序)
irq_handler()
{
...
int int_src = read_int_status();/*读硬件的中断相关寄存器*/
switch(int_src){//判断中断标志
case DEV_A:
dev_a_handler();
break;
case DEV_B:
dev_b_handler();
break;
...
default:
break;
}
...
}
定时器中断的原理
定时器在硬件上也以来中断,PIT(可编程间隔定时器)接收一个时钟输入,当时钟脉冲到来时,将目前计数值增1并与已经设置的计数值比较,若相等,证明计数周期满,产生定时器中断,并复位计数值。
定时器工作原理
Linux中断详解
Linux中断机制与信号
异常(也叫软件中断):当指令执行时由CPU控制单元产生,异常也称为"异步中断",因为只有在一条指令终止执行之后CPU才会发出中断。
分类:
1.处理器探测到的异常
2.故障
3.陷阱
4.异常终止
5.编程异常(软中断),int 指令是软中断指令。中断向量表是中断号和中断处理函数地址的对应表。int n --触发中断n,相应的中断处理函数的地址为:中断向量表地址+4*n
来源:程序的错误产生,内核必须处理的异常(例如:缺页和内核服务的请求-int)
软中断和硬中断的区别
-
软中断(不可屏蔽):1。 编程异常通常叫做软中断。 2.软中断是通讯进程之间用来模拟硬件中断的一种通讯方式。 3.中断源发出中断请求或者是软中断信号以后,CPU或接收进程在适当的时机自动的进行中断处理或者是完成软中断信号对应的功能。4.软中断是软件实现的中断,也就是程序运行时其他的程序对它的中断,而硬中断是硬件实现的中断,是程序运行时设备对它的中断。5.软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。
-
硬中断(可屏蔽,NMI除外):1.由外部事件引起,因此具有随机性和突发性;软中断是执行中断指令产生的,没有外部施加的中断请求信号,因此中断的发生不是随机的,而是程序安排好的。2. 硬件中断的中断响应周期CPU需要发中断回合信号(NMI不需要)。软中断的中断响应周期,CPU不需要发中断回合信号。3. 硬中断的中断号是由中断控制器提供的。软中断的中断号由指令直接指出,无需使用中断控制器。4.硬中断的处理程序要确保它能够快速的完成任务,这样才才不会等待较长的时间,称为上半部。
中断由异步的外部事件引起,外部事件和中断响应与正在执行的指令不存在关系80386有两根引脚INTR和NMI接受外部的中断请求信号,INTR接收可屏蔽中断请求,标识寄存器EFLAGS中的IF标志决定是否屏蔽可屏蔽中断请求。处理器必须要接受和处理来自NMI的中断请求。在80386系统中,处理器在响应NMI的中断向量号固定为2.为了避免不可屏蔽的中断的嵌套,当接收到一个NMI中断请求时,处理器自动的屏蔽所有的NMI请求,直到执行中断指令IRET之后才会重新开放NMI中断请求。所以,NMI处理程序应该以IRET指令结束。
为了满足系统的实时性要求,中断的处理应该要越快越好。Linux中为了实现这个特点,当中断发生的时候,硬中断处理那一些短时间内就可以完成的工作,而将那些处理时间比较长的工作,放在中断之后来完成,也就是软中断来完成。Linux下的硬中断是可以嵌套的,没有优先级的概念。也就是说任何一个新的中断都可以打断正在执行的中断,但是同一种中断除外。软中断是不能嵌套的,但是相同类型的软中断可以在不同的CPU上并行执行。
1. 硬件提供的中断机制和约定
- 中断向量寻址:硬件提供可供256个服务程序中断进入的入口,即中断向量;中断向量在保护模式下的实现机制是中断描述符表idt,idt的位置由idtr确定,idtr是个48位的寄存器,高32位是idt的基址,低16位为idt的界限(通常为2k=256*8);