中断、异常和系统调用是操作系统中十分重要的概念,在这里略作介绍,当作一个复习。
首先,中断和异常的联系是十分紧密的,广义的中断既包含中断也包含异常。
中断(广义):会改变处理器执行指令的顺序,通常与CPU芯片内部或外部硬件电路产生的电信号相对应,广义的中断包括以下两类:
1.异常一般都是由CPU内部或者进程产生(有的博客说异常又叫同步中断、内中断,是当指令执行时由cpu控制单元产生的,之所以称之为异常,是因为只有在一条指令结束之后才发出中断(这里可了解下cpu执行指令的周期),当然我不知道是不是有这种说法)
2.中断又叫异步中断、外中断,是由其他硬件设备依照cpu时钟信号随机产生的。
在中断系统中有两个名字很相像的结构,就是中断描述符表和中断描述符数组。这里我们先说说中断描述符表。一个系统中的中断和异常加起来一共是256个,它们以向量的形式保存在中断描述符表中,每一个向量是8字节(整个表大小就是8x256=2048字节),其主要保存着权限位和向量对应的中断或异常处理程序的入口地址,在运行中断之前,必须初始化IDT(中断描述符表),当然一般是在系统启动时即初始化。而一般的,linux会将中断描述符表中的0~31用于非屏蔽中断和异常,其他的中断用于32~255之间。这个中断描述符表的基地址保存在一个特定的叫idtr的寄存器中。
Intel把中断描述符分三类:任务门、中断门、陷阱门,而Linux则分成五类:
1.中断门:Intel的中断门,DPL = 0,描述中断处理程序
2.系统门:Intel的陷阱门,DPL = 3,用于系统调用
3.系统中断门:Intel的中断门,DPL = 3,能够被用户进程访问的陷阱门
4.陷阱门:Intel陷阱门,DPL = 0,大部分的异常处理
5.任务门:Intel任务门,DPL = 0,对"Double fault"异常处理
如果产生的广义中断是异常,以系统调用为例,根据eax寄存器中存放的子功能号以及实现建立好的子功能表找到对应的服务程序,其他的异常应该也是类似的处理,我也不太清楚。
而如果产生的是狭义的中断的话则有些麻烦。