中断和中断处理
是什么?
中断用来完成硬件与操作系统间的通信,使操作系统能有效的管理硬件。
实现机制
键盘控制器(电信号)—>中断控制器(多路复用)—>处理器(停止当前工作)—>操作系统(中断处理程序)
怎样识别不同设备发出的中断?
每个中断有一个唯一的数字标识,称为IRQ(中断控制线)或中断号,一共16个其中有一个用于桥接,所以能让硬件调用的只有15个。
IRQ编号 设备名称 用途
IRQ0 Time 电脑系统计时器
IRQ1 KeyBoard 键盘
IRQ3 COM2 串口设备
IRQ5 LPT2 建议声卡使用该IRQ
IRQ8 CMOS Alert 即时时钟
IRQ10 Reversed 建议保留给网卡使用该IRQ
IRQ11 Reversed 建议保留给AGP显卡使用
IRQ12 PS/2Mouse 接PS/2鼠标,若无也可设定给其他硬件使用
IRQ13 FPU 协处理器用,例如FPU(浮点运算器)
不同架构的处理器都会将某些中断号固定下来,未固定中断号的硬件会由linux内核动态分配中断号
注册中断处理程序(发生在设备驱动程序加载的时候)
int request_irq(unsigned int irq, /*中断号
irq_handler_t handler, /*函数指针
unsigned long flags, /*标志位, IRQF_SHARED
const char* name, /*中断相关设备ASCII文本表示
void *dev) /*用于中断共享,不同设备的唯一标识。
释放中断处理程序
void free_irq(unsigned int irq,void * dev)
*中断处理程序通常不是和特定设备关联,而是和特定中断相连的。也就是说,如果一个设备可以产生多种不同中断,那么设备可以对应多个中断处理程序.一个中断线如果声明为可以共享的话,那这个中断线上也可以有几个中断处理程序。
(1)处理器在中断了当前工作后,会跳到内存中预定义的位置执行那里的代码。每条中断线跳到的位置都是唯一确定的。
(2)执行do_IRQ(),将当前中断线在所有处理器上都屏蔽掉,查看当前中断线上是否有可用的中断处理程序。是则执行第三步,不是则直接执行第四步。
(3)handler_IRQ_event()
(4)ret_from_intr() 判断 调度程序是否被挂起,如果是则 重新调度。如果返回的是进程上下文的话,则还要查看 preempt_count标志位,判断是否支持内核抢占。
是什么?
中断用来完成硬件与操作系统间的通信,使操作系统能有效的管理硬件。
实现机制
键盘控制器(电信号)—>中断控制器(多路复用)—>处理器(停止当前工作)—>操作系统(中断处理程序)
怎样识别不同设备发出的中断?
每个中断有一个唯一的数字标识,称为IRQ(中断控制线)或中断号,一共16个其中有一个用于桥接,所以能让硬件调用的只有15个。
IRQ编号 设备名称 用途
IRQ0 Time 电脑系统计时器
IRQ1 KeyBoard 键盘
IRQ3 COM2 串口设备
IRQ5 LPT2 建议声卡使用该IRQ
IRQ8 CMOS Alert 即时时钟
IRQ10 Reversed 建议保留给网卡使用该IRQ
IRQ11 Reversed 建议保留给AGP显卡使用
IRQ12 PS/2Mouse 接PS/2鼠标,若无也可设定给其他硬件使用
IRQ13 FPU 协处理器用,例如FPU(浮点运算器)
不同架构的处理器都会将某些中断号固定下来,未固定中断号的硬件会由linux内核动态分配中断号
注册中断处理程序(发生在设备驱动程序加载的时候)
int request_irq(unsigned int irq, /*中断号
irq_handler_t handler, /*函数指针
unsigned long flags, /*标志位, IRQF_SHARED
const char* name, /*中断相关设备ASCII文本表示
void *dev) /*用于中断共享,不同设备的唯一标识。
释放中断处理程序
void free_irq(unsigned int irq,void * dev)
*中断处理程序通常不是和特定设备关联,而是和特定中断相连的。也就是说,如果一个设备可以产生多种不同中断,那么设备可以对应多个中断处理程序.一个中断线如果声明为可以共享的话,那这个中断线上也可以有几个中断处理程序。
(1)处理器在中断了当前工作后,会跳到内存中预定义的位置执行那里的代码。每条中断线跳到的位置都是唯一确定的。
(2)执行do_IRQ(),将当前中断线在所有处理器上都屏蔽掉,查看当前中断线上是否有可用的中断处理程序。是则执行第三步,不是则直接执行第四步。
(3)handler_IRQ_event()
(4)ret_from_intr() 判断 调度程序是否被挂起,如果是则 重新调度。如果返回的是进程上下文的话,则还要查看 preempt_count标志位,判断是否支持内核抢占。