标签:
首先解释一些容易混淆的概念:
中断上下文:正在执行ISR或者下半部。没有进程背景(只是暂停CPU去内存中其他地方执行一段快速代码),所以不能被切换(比如睡眠,被其他进程抢占等都不行)。
进程上下文:非中断上下文(比如执行系统调用或者内核线程的时候)。此时内核代表线程在执行,所以允许睡眠,被抢占等(被切换)。
中断栈:每个处理器有一个专门的中断栈。以前中断处理程序都是使用中断进程的内核栈(只有一个),但是内核栈越来越不够用,所以中断处理程序有了自己的栈---中断栈,每个处理器一个。
中断源:
(a) 外设请求(通过中断线,CPU从INTR引脚接收信号);
(b) 定时器时间到(可编程定时器完成计时任务);
(c) 硬件故障和程序出错;
(d) 软件中断(软件中断指令产生,是程序实现安排好的);
中断类型:
(1)硬件中断(外部中断):由硬件产生的异步中断,不知道什么时候会到来。
(e)可屏蔽中断:从INTR引脚接收的信号。一般是由外设发送过来。可以被屏蔽,如果被屏蔽掉了,中断控制器会在寄存器中某个位记录这一请求,等到中断被开启时再去驱动CPU的INTR。如果同一时刻有多个中断请求,则中断控制器会先向CPU报告优先级高的中断,然后再报告优先级低的。
可以有三种方式关闭外部可屏蔽中断:
---通过cli指令将标志寄存器中IF位清零,关闭所有中断线。
注意请中断指令只是关闭中断线,不会影响软件中断和不可屏蔽中断;
---通过中断控制器中的终端屏蔽寄存器,屏蔽掉某一特定的中断线(IRQn);
---通过设备的设备控制寄存器控制该设备是否发出中断,屏蔽单个设备;
可屏蔽中断响应时间:
CPU接收到INTR引脚传来的信号时,必须具备以下四个条件才予以响应:
(1) 无总线请求;
(2) 无非屏蔽中断请求;
(3) CPU允许中断;
(4) CPU执行完现行指令;
(f)不可屏蔽中断:例如CPU掉电等;
非屏蔽中断响应时间:
CPU接收到来自NMI引脚传来的信号,必须具备以下两个条件才予以响应:
(1) 无总线请求;
(2) CPU执行完现行指令;
(2)软件中断(内部中断):由CPU内部指令产生,是同步中断(从CPU的角度看)。
(a)Fault:指令执行出错;
(b)Traps:通过中断描述符表预定,例如INT3等,相当于立即执行一条跳转指令,跳转到ISR入口地址;
(c)Aborts:严重错误;
中断向量划分:
中断向量是8位的,总共可以有256(0-255)项,处理器使用0-31号作为内部中断,而其余的可以自由使用。一般8259A的IRQ0使用32,IRQ1使用33。。。Linux中使用Int 0x80作为系统调用。
中断的初始化:
不同硬件系统有不同的终端控制器,因此内核定义了一个irq_chip结构来描述中断控制器,内核无需关心具体细节。设备驱动程序只需要参照其datasheet,提供硬件相关的操作函数,定义一个irq_chip对象就可以了。
关中断指令CLI:
并不会影响软件中断(INT0x80),因为关中断是清除中断请求寄存器的相应位,即禁止中断线,只能关闭外部硬件中断,而不能影响CPU内部软件中断。
标签:
原文地址:http://blog.csdn.net/jiyiqinlovexx/article/details/46582737