前面我们已经提到,Linux把向量0~31分配给异常和非屏蔽中断,而把32~47之间的向量分配给可屏蔽中断,可屏蔽中断的向量是通过对中断控制器的编程来设置的。前面介绍了
先简单介绍一下
ICW1:初始化命令字。
ICW2:中断向量寄存器,初始化时写入高五位作为中断向量的高五位,然后在中断响应
时由8259根据中断源(哪个管脚)自动填入形成完整的8位中断向量(或叫中断类
型号)。
ICW3: 8259的级连命令字,用来区分主片和从片。
ICW4:指定中断嵌套方式、数据缓冲选择、中断结束方式和CPU类型。
outb(0xff, 0x21); /* 送数据到工作寄存器OCW1(又称中断屏蔽字),
屏蔽所有外部中断, 因为此时系统尚未初始化完毕,
outb(0xff,
0xA1); 不能接收任何外部中断请求 */
outb_p(0x11, 0x20); /*送0x11到ICW1(通过端口0x20),启动初始化编程。
0x11表示外部中断请求信号为上升沿有效,系统中有
多片
outb_p(0x20 + 0, 0x21); /* 送0x20到ICW2,写入高五位作为中断向量的高五
位,低3位根据中断源(管脚)填入中断号0~7,
因此把IRQ0-7映射到向量0x20-0x27 */
outb_p(0x04, 0x21); /* 送0x04到ICW3,ICW3是8259的级连命令字,
0x04表示
outb_p(0x11, 0xA0); /* 用ICW1初始化
outb_p(0x20
+ 8, 0xA1); /* 用ICW2把
outb_p(0x02,
0xA1); /* 送0x04到ICW3。表示
并连接在
outb_p(0x01, 0xA1); /* 把0x01送到ICW4 */
最后一句有四方面含义:① 中断嵌套方式为一般嵌套方式。当某个中断正在服务时,本级中断及更低级的中断都被屏蔽,只有更高级的中断才能响应。注意,这对于多片
outb_p()函数就是把第一个操作数拷贝到由第二个操作数指定的I/O端口,并通过一个空操作而产生一个暂停。
这里介绍了