咸鱼白的窝
一些奇奇怪怪的东西
Blanca-OS设计之中断(待更新)

中断

中断,即CPU接收到一定的信号,打断了当前的程序控制流以处理其他事务的机制。 中断主要可分为两类:同步中断与异步中断。 其中,同步中断又称异常,可分为故障(fault),陷阱(trap),终止(abort)三类。异步中断则简称为中断。

类别
中断
故障
陷阱
终止

中断例程

Blanca-OS中的所有中断处理程序都要经过一段汇编实现的例程asm_isr_stub(见kernel/idt_asm.asm),该例程将中断将中断发生时的程序信息(主要是寄存器)快照压栈并调用中断号对应的中断处理程序,该快照在C语言中以如下结构体表示(见inc/idt.h):

typedef struct{
	/*段寄存器,16bit*/
	uint32_t fs;
	uint32_t gs;
	uint32_t es;
	uint32_t ds;
	
	/*pusha保存的寄存器*/
	uint32_t edi;
	uint32_t esi;
	uint32_t ebp;
	uint32_t esp;
	uint32_t ebx;
	uint32_t edx;
	uint32_t ecx;
	uint32_t eax;

	/*中断号*/
	uint32_t intr_num;

	/*错误代码*/
	uint32_t err_code;

	uint32_t eip;
	uint32_t cs; //16bit
	uint32_t eflags;

	/*特权级切换时才会压入ss及esp*/
	uint32_t u_esp;
	uint32_t ss; //16bit
}regs_t;

需要注意的是,并非所有的中断都会压入error code(错误代码),故中断发生时的程序快照结构体本应有两种,但此处为了方便后续程序的编写进行了统一,即在汇编macro生成的不压入错误代码的相关中断的处理程序中(见kernel/idt_s.asm)自动在相应位置压入32字节数据,该数据值统一为0。


Last modified on 2020-04-28