中断处理主要分为以下几个步骤:初始化PIC -> 编写中断处理函数 -> 在IDT中注册中断
1. 初始化PIC:1) 设定一些模式;
2) 将PIC各管脚接收到的IRQ与中断号对应起来,决定IRQ以哪一号中断通知CPU;
3) 确定主从PIC之间的连接方式。
PIC(可编程中断控制器,Programmable Interrupt Controller),由于CPU只能处理一个中断,所以需要PIC来帮助处理多个中断。
中断发生以后,如果CPU可以受理这个中断,CPU就会命令PIC发送2个字节的数据。由于电路设计的原因,这两个字节的数据在CPU看来,与从内存读进来的程序是完全一样的。而该传输的数据就是调用BIOS时的INT指令,CPU即执行该数据,也就将数据当作程序来执行的情况。
2. 编写中断处理函数:主要是让CPU从相应设备端口读取数据,然后对读取到的数据进行相应的处理(比如将数据放入队列,在下半部进行处理)。
从端口读取数据的函数(读取一个字节的数据):
_io_in8: // io_in8(int port)
MOV EDX, [ESP + 4]
MOV EAX, 0
IN AL, DL
RET
其中,EAX一般作为返回值返回,所以都将值赋给EAX。
为了加快中断处理的效率,一般上半部只负责数据的接收,然后将数据存入队列。下半部负责从队列中读取数据并进行处理。
3. 在IDT(中断记录表)中注册中断:
中断描述符表(Interrupt Descriptor Table,IDT)是一个系统表,它与每一个中断或异常相联系,每一个向量在表中存放的是相应的中断或异常处理程序的入口地址。