前言
现在我们跟着《x86/x64体系探索及编程》来分析17章内容 -- 8259中断控制器。这个是涉及硬件的,很遗憾,除了大学期间使用STM32搞过一个计算器,其余就没多少硬件编程经验,我在淘宝上找了下大概是这个东东。
https://pdos.csail.mit.edu/6.828/2010/readings/hardware/8259A.pdf
上面是8259A的芯片手册,里面讲的还是挺详细的,虽然里面很多东西还是看不太懂,但是结合着《x86/x64体系探索及编程》这本书还是比较好理解的。
因为本身自己还不太了解,所以并不打算把这个芯片上的内容给讲一遍,只介绍一下我认为比较重点的,很多知识自己确实不太懂。
在bochs源码的iodev\pic.cc,你可以看到对于8259A芯片的各种实现,我们这篇文章就是围绕这个来写的。
两块8259串联
如下图,其在使用的过程中是将两块8259串联在一起,这样有什么好处呢?其增大了响应中断的个数,一个最多只能响应8个中断,则两个可以响应15个中断。(Slave的INTR接入Master的IR2)
当两个串联在一起时,其Slave模块的中断等级相当于IRQ2,因此这么算下来,其优先级依次为 IRQ0, IRQ1, IRQ8~IRQ15,IRQ3~IRQ7。
下面是bochs的模拟代码,其在 bochs\iodev\pic.cc 这个文件里,8286A pic,其pic含义为low pin count。
class bx_pic_c : public bx_pic_stub_c {
....
....
private:
struct {
bx_pic_t master_pic;
bx_pic_t slave_pic;
} s;
....
....
};
三个重要的寄存器
ISR、IMR、IRR是三个至关重要的寄存器,下面是芯片手册的三张图,我们可以很清晰地看清这三者的关系:
其中各个IR端口是连接着IRR,来的各种中断信号都是先存储在这里,之后这里会有一个优先级排序,这里被称之为“仲裁”(后面会在源码中看到),如果仲裁成功,表示其优先级最高,然后将IRR相应位置为0,并将ISR相应位置为1,当ISR相应位变为1时,会触发一个interrupt vector,通过data bus传递给pro