中断向量 ●每个中断和异常由0~255之间的一个数(8位)来标识, Intel称其为中断向量。 ·非屏敲中断的向量和异常的向量是固定的 。可屏蔽中断的向量可以通过对中断控制器的编程来改变 1口4四1是4P在刀0C 陈香兰(x1 anchenoustc,edu.cn)(升算丸应Linux禄作系统分折Chapter5中断和并常 0 ctober21,201411/6阅
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 中断向量 每个中断和异常由0~255之间的一个数(8位)来标识, Intel称其为中断向量。 非屏蔽中断的向量和异常的向量是固定的 可屏蔽中断的向量可以通过对中断控制器的编程来改变 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 5 中断和异常 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 21, 2014 11 / 69
中断的产生 ·每个能够发出中断请求的硬件设备控制器都有一条称为 IRQ(Interrupt ReQuest)的输出线o ●所有的IRQ线都与一个中断控制器的输入引脚相连 。中断控制器与CPU的INTR引脚相连 设备 IRQ 中断 INTR 设备 CPU 控制器 控制器 ·中断控制器执行下列动作: O监视IRQ线,对引发信号检查 ©如果一个引发信号出现在IRQ线上 ●把此信号转换成对应的中断向量 ©把这个向量存放在中断控制器的一个I/0端口,从而允许CPU 通过数据总线读这个向量 O把引发信号发送到处理器的INTR引脚,即在CPU上产生一个中断 O等待,直到CPU应答此信号;收到应答后,清INTR引脚 ⊙返回第一步 4口4四1是42刀00 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux禄作系统分折Chapter5中断和并常 (ctober 21.2014 12/阅
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 中断的产生 每个能够发出中断请求的硬件设备控制器都有一条称为 IRQ(Interrupt ReQuest)的输出线。 所有的IRQ线都与一个中断控制器的输入引脚相连 中断控制器与CPU的INTR引脚相连 设备 设备 控制器 IRQ 中断 控制器 INTR CPU 中断控制器执行下列动作: 1. 监视IRQ线,对引发信号检查 2. 如果一个引发信号出现在IRQ线上 1. 把此信号转换成对应的中断向量 2. 把这个向量存放在中断控制器的一个I/O端口,从而允许CPU 通过数据总线读这个向量 3. 把引发信号发送到处理器的INTR引脚,即在CPU上产生一个中断 4. 等待,直到CPU应答此信号;收到应答后,清INTR引脚 3. 返回第一步 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 5 中断和异常 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 21, 2014 12 / 69
IRQ号和中断向量号 ●中断控制器对输入的IRQ线从0开始顺序编号 。IR0,IR1,·,IR7 。Inte1给中断控制器分配的中断向量号从32开始, 上述IRQ线对应的中断向量依次是 ●32+0、32+1、… ●可以对中断控制器编程: 。修改起始中断向量的值,或 。有选择的屏敲/激活每条IRQ线 ●注意: ①屏蔽卡丢失: ●屏敲的中新不会丢失 ●一旦被激活,中断控制器又会将它们发送到CPU ©有选择的屏敲/激活IRQ线+全局屏蔽/激活 ●前者通过对中断控制器编程实现 。后者通过特定的指令操作CPU中的状态字 1口140是420C 陈香兰(x1 anchenoustc,edu,cn)(计界丸应Linux禄作系统分折Chapter5中断和并常 0 ctober21,201413/阅
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IRQ号和中断向量号 中断控制器对输入的IRQ线从0开始顺序编号 IR0,IR1,… ,IR7 Intel给中断控制器分配的中断向量号从32开始, 上述IRQ线对应的中断向量依次是 32+0、32+1、… 可以对中断控制器编程: 修改起始中断向量的值,或 有选择的屏蔽/激活每条IRQ线 注意: 1. 屏蔽 ̸= 丢失: 屏蔽的中断不会丢失 一旦被激活,中断控制器又会将它们发送到CPU 2. 有选择的屏蔽/激活IRQ线 ≠全局屏蔽/激活 前者通过对中断控制器编程实现 后者通过特定的指令操作CPU中的状态字 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 5 中断和异常 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 21, 2014 13 / 69
I386:开中商和关中断 。CPU可以屏蔽所有的可屏蔽中断 。Ef1ags中的IF标志: 0=关中断; 1=开中断。 。关中断时,CPU不响应中断控制器发布的任何中断请求 。内核中使用cli和sti指令分别清除和设置该标志 关中断和开中断,参见include/asm-x86/irqf1ags.h static inline void native_irq_disable(void){ asm volatile(”cli”:::”memory”): static inline void native_irq_enable(void){ asm volatile("sti”:::”memory'”): 4口4四是4P在刀0C 陈香兰(x1 anchenoustc,edu,cn)(计算丸应Linux禄作系统分折Chapter5中断和并常 0 ctober21,201414/0
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I386:开中断和关中断 CPU可以屏蔽所有的可屏蔽中断 Eflags中的IF标志: 0=关中断; 1=开中断。 关中断时,CPU不响应中断控制器发布的任何中断请求 内核中使用cli和sti指令分别清除和设置该标志 . 关中断和开中断,参见include/asm-x86/irqflags.h . . static inline void native_irq_disable(void) { asm volatile(”cli”: : :”memory”); } static inline void native_irq_enable(void) { asm volatile(”sti”: : :”memory”); } 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 5 中断和异常 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 21, 2014 14 / 69
传统的中断控制器:8259A ●传统的中断控制器使用两片8259A以“级联”的方式连接在一起 。每个芯片可以处理最多8个不同的IRQ线 ●主从两片8259A的连接: 。从片→主片的IRQ2引脚 8259 CPU OS 主 设备 8259 从 ●因此,一共可以处理最多15个不同的IRQ线 4口4四是4P在刀00 东香兰(x1 anchenoustc,edu,cn)(计算丸应Linux禄作系统分折Chapter5中断和并常 0 ctober21,201415/0
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 传统的中断控制器:8259A 传统的中断控制器使用两片8259A以“级联”的方式连接在一起 每个芯片可以处理最多8个不同的IRQ线 主从两片8259A的连接: 从片→主片的IRQ2引脚 设备 ✲ ✲ ✲ ✲ ✲ ✲ ✲ ✲ ✲ ✲ ✲ ✲ ✲ ✲ ✲ ✲ 8259 主 8259 从 CPU OS 因此,一共可以处理最多15个不同的IRQ线 陈香兰(xlanchen@ustc.edu.cn) (计算机应用教研室 Linux操作系统分析Chapter 5 中断和异常 @计算机学院嵌入式系统实验室@苏州研究院中国科学技术大学Fall 2014) October 21, 2014 15 / 69