外部中断的情况复杂一些,因为需要建立硬件中断与向量号之间的对应关系。外部中断分为不可屏蔽中断(NMI)和可屏蔽中断两种,分别由CPU的两根引脚NMI和INTR来接收。如下图所示:可屏蔽中断与CPU的关系是通过对可编程中断控制器8259A建立起来的。8259A可以认为它是中断机制中 ...
外部中断的情况复杂一些,因为需要建立硬件中断与向量号之间的对应关系。外部中断分为不可屏蔽中断(NMI)和可屏蔽中断两种,分别由CPU的两根引脚NMI和INTR来接收。如下图所示:
可屏蔽中断与CPU的关系是通过对可编程中断控制器8259A建立起来的。8259A可以认为它是中断机制中所有外围设备的一个代理。在BIOS初始化它的时候,IRQ0~IRQ7被设置为对应向量号08h~0Fh,在保护模式下向量号08h~0Fh已经被占用了,所以我们不得不重新设置主从8259A。
对8259A的设置并不复杂,通过向相应的端口写入特定的ICW来实现。主8259A对应的端口地址是20h和21h,从8259A对应的端口地址是A0h和A1h。ICW共有4个。初始化过程如下:
1.往端口20h(主片)或A0h(从片)写入ICW1.
2.往端口21h(主片)或A1h(从片)写入ICW2.
3.往端口21h(主片)或A1h(从片)写入ICW3.
4.往端口21h(主片)或A1h(从片)写入ICW4.
这4步的顺序是不能颠倒的。
ICW格式如下
Init8259A: mov al, 011h out 020h, al ; 主8259, ICW1. call io_delay out 0A0h, al ; 从8259, ICW1. call io_delay mov al, 020h ; IRQ0 对应中断向量 0x20 out 021h, al ; 主8259, ICW2. call io_delay mov al, 028h ; IRQ8 对应中断向量 0x28 out 0A1h, al ; 从8259, ICW2. call io_delay mov al, 004h ; IR2 对应从8259 out 021h, al ; 主8259, ICW3. call io_delay mov al, 002h ; 对应主8259的 IR2 out 0A1h, al ; 从8259, ICW3. call io_delay mov al, 001h out 021h, al ; 主8259, ICW4. call io_delay out 0A1h, al ; 从8259, ICW4. call io_delay mov al, 11111110b ; 仅仅开启定时器中断 ;mov al, 11111111b ; 屏蔽主8259所有中断 out 021h, al ; 主8259, OCW1. call io_delay mov al, 11111111b ; 屏蔽从8259所有中断 out 0A1h, al ; 从8259, OCW1. call io_delay ret
原标题:Linux内核系列—8.操作系统开发之时钟中断
关键词:linux
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。