内核笔记 - IRQs and PIT
安装好了IDT之后,接下来就来实现中断请求。
外设中断由中断控制芯片8259A进行控制,想要了解其中的原理可以看这篇文章:保护模式下的 8259A芯片编程 及中断处理探究
初始化8259A
在init_idt()函数开头加入初始化代码,用来初始化设置8259A芯片。
1 | /* |
定义IRQ处理函数
声明IRQ函数
1 | /* |
和安装isr差不多,使用了宏。
1 | /* |
IRQ处理函数实现
这段代码当时我不太理解,看了一天给我整崩溃了。
irq_handler的功能就是如果请求号>40表示是从片控制的,它是一个EOI消息,会将从片重置,目的就是清空8259A中的ISR的位。
主片每次都会重置,所以一定会执行 outb(0x20,0x20);
最后触发具体的中断处理函数。
1 | /* |
register_interrupt_handler 用来安装中断号对应的处理函数。
PIT 时钟中断
PIT就是 programmable interval timer的缩写,它连接到了IRQ0。
原理请参考:Programmable Interval Timer
init_timer的作用就是,使IRQ0对应timer_callback这个处理函数,然后设置好PIT的频率和工作模式。
之后内核会根据频率,调用timer_callback,每次调用一次变量i就+1。
1 | /* |
运行效果: