在上一篇文章中我们讲述了如何定义一个异常处理函数以及如何向IDT注册异常处理函数,在本篇中我们开始定义一个中断处理函数以及启用我们的中断处理函数
定义一个中断处理函数
定义一个中断函数很简单,函数的签名与异常处理函数的签名一致,只不过中断处理函数是不需要错误返回码的
定义一个基本中断处理函数如下
use system::Mutex;
use system::ia_32e::cpu::ChainedPics;
...
pub static PICS: Mutex<ChainedPics> = Mutex::new(unsafe { ChainedPics::new(PIC_MAIN, PIC_SLAVE) });
...
extern "x86-interrupt" fn example_interrupt(_stackframe: &mut InterruptStackFrame) {
...
}
很简单不是吗,相比于异常处理函数,中断处理函数除了函数名不同以外还需要做一些额外的工作,还记得我们的PIC嘛?我们初始化一直冷落它,现在是它该发挥作用的时候了具体请查看使用Rust开发操作系统(可编程中断控制器(PIC)8259A)
我们把之前的PIC图拿过来
定义中断向量
我们编写中断属于硬件中断,主要是通过8259A来完成,不属于软件中断,注册中断时我们需要提供中断向量号,那么注册IRQ时钟中断时向量号为多少呢,向量号可以自定义的~那么给多少合适呢,我们需要看一看下表
Vector | Mne-monic | Description Type Error Code Source |
---|---|---|
0 | #DE | Divide Error Fault No DIV and IDIV instructions. |
1 | #DB | Debug Exception Fault/ Trap No Instruction, data, and I/O breakpoints; single-step; and others. |
2 | — | NMI Interrupt Interrupt No Nonmaskable external interrupt. |
3 | #BP | Breakpoint Trap No INT3 instruction. |
4 | #OF | Overflow Trap No INTO instruction. |
5 | #BR | BOUND Range Exceeded Fault No BOUND instruction. |
6 | #UD | Invalid Opcode (Undefined Opcode) Fault No UD instruction or reserved opcode. |
7 | #NM | Device Not Available (No MathCoprocessor) Fault No Floating-point or W |