从产生原因看,中断和陷入也有巨大的差别。
硬件中断由外部事件造成,属于异步事件,往往与当前进程毫无关系;
陷入则不同,它常常都是同步的(如除0错),并与当前进程上下文相关。
除此之外,陷入还用来实现系统调用——内核为user进程提供了大量的服务,这些服务就是通过系统调用
来访问的。PDP11提供了trap指令来使user进程进入内核,进行系统调用。
由于系统调用的存在,内核在逻辑上可以分为上下两层。上层用于为user进程提供服务,并对陷入和系统
调用提供响应,这部分可看作是所有进程共享的程序库。而下层在用于处理硬件中断,它们异步产生,
其执行也不依赖于当前进程——尽管与当前进程可能毫无关系,中断处理程序仍会借用当前进程的kernel stack。
系统调用代码被所有进程所共享,因此必须小心进行设计,以避免因内核数据结构共享造成的冲突和不一致
的情况。一个总的设计原则是,避免内核状态下的进程抢占。即如果进程正在内核态执行,其执行最好不受打扰,
除非它因等待系统资源或事件自行放弃cpu。
当然,如果不加处理进程在内核的执行过程中也会被硬件中断抢占。对于硬件中断,有几种处理方式:
(1)可能的话,可以通过设置优先级来屏蔽某些硬件中断;
强调一点,当上下两层共享某内核资源时,上层程序在占用该资源前要屏蔽下层中断。否则,
中断发生后,中断处理程序将无法获取该资源——对系统调用等同步处理程序来说,它可以通过sleep等待
资源;但中断本身为异步事件,使它等待是无意义的。
(2)某些重要的中断不能屏蔽,但可以在其中断处理程序中加以判断,
如为内核时发生的中断,则只执行必要的操作。
因此,在代码中会有很多对前状态的检查,以确定在中断发生时,进程是否处于内核态。
博客地址:http://blog.csdn.net/cszhao1980
博客专栏地址:http://blog.csdn.net/column/details/lions-unix.html