设置IRQ硬件中断(硬件中断包括时钟中断、键盘中断等),可参考《自己动手写操作系统 第1版》p112,《Inter微处理器 第8版》p364
在8259中,需要把 IRQ0~IRQ7 映射到中断向量0x20~0x27,把 IRQ8~IRQ15 映射到中断向量0x28~0x2f。
8259.h的源代码如下所示
#ifndef _8259_H_
#define _8259_H_
#define M_PIC 0x20
#define M_IMR 0x21
#define S_PIC 0xa0
#define S_IMR 0xa1
#define EOI 0x20
void init8259(void);
void enable_irq(unsigned short irq_no);
void disable_irq(unsigned short irq_no);
void enable_all_irq();
void disable_all_irq();
#endif
8259.c的源代码如下所示
#include "8259.h"
#include "io.h"
unsigned int irq_mask = 0xffff; //所有的IRQ开始时都被屏蔽
void init8259(void)
{
outportb(M_PIC, 0x11); //主8259,ICW1
outportb(S_PIC, 0x11); //从8259,ICW1
outpor