linux内核-中断、异常和系统调用

我们假定博客的读者已经具备了计算机系统结构方面的基础知识,所以本系列博客对中断以及异常(exception)处理的原理和机制不作深入的介绍。缺乏这方面基础的读者不妨先阅读一些微处理器方面的材料。不过,我们也并不要求读者对相关内容已经具备了很深入的理解。事实上,随着我们的介绍和分析,特别是随着各个情景的发展和代码的阅读,读者自会逐步地加深理解。

先简要提一下,中断有两种,一种是由CPU外部产生的,另一种是由CPU本身在执行程序的过程中产生的。

外部中断,就是通常所讲的中断(interrupt)。对于执行中的软件来说,这种中断的发生完全是异步的,根本无法预测此类中断会在什么时候发生。因此,CPU(或者软件)对外部中断的响应完全是被动的。不过,软件可以通过关中断指令对中断的响应,把它反映情况的途径掐断,这样就可以眼不见心不烦了(这里不考虑不可屏蔽中断)。

由软件产生的中断则不同,它是由专门的指令,如X86中的INT n,在程序中有意产生的,所以是主动的,同步的。只要CPU执行了一条INT指令,就知道在开始执行下一条指令之前一定要先进入中断服务程序。这种主动的中断称为陷阱(trap)。

此外,还有一种与中断相似的机制称为异常(exception),一般也是异步的,多半由于不小心犯了规才发生。例如,当你在程序中发出一条除法指令DIV,而除数为0,就会发生一次异常。这多半是因为不小心,而不是故意的,所以也是被动的。当然,也不排除故意的可能性。我们在内存管理系列博客中看到通过页面异常扩展堆栈区间的情景,那就是故意安排的。

这样,一共就有三种类似的机制,即中断、陷阱以及异常。

但是,不管是外部产生的中断还是陷阱,或者异常,不管是无意的、被动的、还是故意的、主动地,CPU的响应过程却是基本上一致。这就是:在执行完成当前指令以后,或者在执行当前指令的中途,就根据中断源所提供的中断向量,在内存中找到相应的服务程序入口并调用该服务程序。外部中断的向量是由软件或硬件设置好了的,陷阱的向量是在自陷指令中发出的(INT n中的n),而各种异常的向量是CPU的硬件结构中预先规定好的。这样,这些不同的情况就因中断向量的不同而互相区分开来了。因此,在实践中常常将这些不同的情况作为一种统一的模式加以考虑和实现,而且常常统称为中断。至于系统调用,一般都是通过INT指令实现的,所以也与中断密切相关。

本系列博客的前一部分内容讲中断,包括中断的硬件支持、软件处理以及中断响应和服务的过程;后一部分则介绍系统调用的有关内容。

おすすめ

転載: blog.csdn.net/guoguangwu/article/details/120933603
おすすめ