1 中断分为同步中断(中断)和异步中断(异常)
1.1 中断和异常的不同
-
中断由IO设备和定时器产生,用户的一次按键会引起中断。异步。
-
异常一般由程序错误产生或者由内核必须处理的异常条件产生。同步。缺页异常,断点int3
异常如果由程序错误产生,内核通过发送一个信号来处理异常
如果由内核必须处理的异常条件诱发,那么内核必须执行所需要的所有步骤。
(思考信号产生的动机)
1.2 中断和进程上下文切换的不同
中断切换的代码不是一个进程,而是一个内核控制路径,代表中断发生时正在执行的进程在内核中执行。
1.3 中断敏感性
-
当内核正打算做一些事情,中断随时可能会到来,因此中断必须很快完成(以便内核处理它的事情),尽可能把多的事情放到后面执行。
-
中断随时可能到来,在处理一个中断时必须允许其他中断到来。这样可以允许尽量多的IO设备处于忙碌状态。所以中断应该允许嵌套
-
临界区中,中断必须被禁止。这个要求对于临界区来说是必要的,但是对于内核规则来说是不应当的。所以应该减少临界区。
1.4 中断向量表
非屏蔽中断和异常的向量是固定的,可屏蔽中断的向量可以通过编程来改变。
1.5 IRQ和中断
IRQ(Interrupt request)是设备用来向可编程中断控制器发送中断请求的,IRQ在硬件上和中断控制器相连接。一个设备可能有多条IRQ,如PCI卡有4条。
当设备产生中断信号时,会发送到IRQ线上。中断信号会被中断控制器一直监视,如果有条IRQ线上同时出现中断信号,那么会选取IRQn值最小的那一个优先处理。
中断控制器会将从IRQn上接受来的中断信号转换为对应的向量,将这个向量放到I/O端口上以便CPU需要的时候通过读取数据总线来读。中断控制器将接受到的中断信号转发到CPU的INTR引脚上产生一个中断
接下来就是等待CPU把这个中断信号写进可编程中断控制器的I/O端口来确认这个向量。如果确实是,则清INTR线。
IRQ编号从0开始,IRQn对应的intel的缺省向量为n+32。IRQ和向量的对应关系可以通过一些指令来重新编程。
选择性的禁止IRQ线相当于"服务台"(中断控制器)让客户的需求(设备中断)排队,当开启IRQ时还会来处理需求
通过cli sti来开启和屏蔽可屏蔽中断相当于服务台暂时不上班,客户的需求会被忽略。
1.6 多APIC系统和中断分发方式
-
静态分发
-
动态分发 中断在CPU之间分发
CPU产生处理器之间的中断,这在SMP系统中很有用。
如果是单处理器,那么APIC可以弱化成8259A,LIN0 LIN1分别作为INTR和NMI引脚使用
也可以作为一个外部的I/O APIC使用(虽然它在处理器内部),本地APIC被激活。