中断的打开与关闭
全局中断的打开与关闭(IF位)
void irq_disable_global(void) {
cli();
}
void irq_enable_global(void) {
sti();
}
特定中断的打开与关闭(IMR)
void irq_enable(int irq_num) {
if (irq_num < IRQ_PIC_START) {
return;
}
irq_num -= IRQ_PIC_START;
if (irq_num < 8) {
uint8_t mask = inb(PIC0_IMR) & ~(1 << irq_num);
outb(PIC0_IMR, mask);
} else {
irq_num -= 8;
uint8_t mask = inb(PIC1_IMR) & ~(1 << irq_num);
outb(PIC1_IMR, mask);
}
}
void irq_disable(int irq_num) {
if (irq_num < IRQ_PIC_START) {
return;
}
irq_num -= IRQ_PIC_START;
if (irq_num < 8) {
uint8_t mask = inb(PIC0_IMR) | (1 << irq_num);
outb(PIC0_IMR, mask);
} else {
irq_num -= 8;
uint8_t mask = inb(PIC1_IMR) | (1 << irq_num);
outb(PIC1_IMR, mask);
}
}