linux操作系统中断、异常和系统调用

       中断、异常和系统调用是操作系统中十分重要的概念,在这里略作介绍,当作一个复习。

    首先,中断和异常的联系是十分紧密的,广义的中断既包含中断也包含异常。

    中断(广义):会改变处理器执行指令的顺序,通常与CPU芯片内部或外部硬件电路产生的电信号相对应,广义的中断包括以下两类:
                1.异常一般都是由CPU内部或者进程产生(有的博客说异常又叫同步中断、内中断,是当指令执行时由cpu控制单元产生的,之所以称之为异常,是因为只有在一条指令结束之后才发出中断(这里可了解下cpu执行指令的周期),当然我不知道是不是有这种说法)
                2.中断又叫异步中断、外中断,是由其他硬件设备依照cpu时钟信号随机产生的。
    而我们常提及的系统调用则是由一个int 0x80异常产生而陷入内核当中,个人认为是一个随时可产生的软中断,属于异常中的一种。

       在中断系统中有两个名字很相像的结构,就是中断描述符表中断描述符数组。这里我们先说说中断描述符表。​一个系统中的中断和异常加起来一共是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寄存器中存放的子功能号以及实现建立好的子功能表找到对应的服务程序,其他的异常应该也是类似的处理,我也不太清楚。

    而如果产生的是狭义的中断的话则有些麻烦。

    狭义中断的处理过程:

 能够发出中断请求的硬件设备控制器都有一条称为IRQ(Interrupt ReQuest)的输出线。所有的IRQ线都与一个中断控制器的输入引脚相连,中断控制器与CPU的INTR引脚相连,各硬件通过此来提出中断服务请求。而每个能够产生中断的设备或者模块都会在内核中注册一个中断处理程序,当产生中断时,根据中断向量找到中断描述符,而中断描述符这个结构中包含中断处理程序,通过此可以执行中断处理程序,在中断处理程序中,首先会保存中断向量号和上下文,之后执行中断线对应的中断服务例程。
具体过程如下:
       





    

猜你喜欢

转载自blog.csdn.net/qq_35985044/article/details/80708587