(莱昂氏unix源代码分析导读-18) 再谈中断与陷入

 

从产生原因看,中断和陷入也有巨大的差别。

 

硬件中断由外部事件造成,属于异步事件,往往与当前进程毫无关系;

陷入则不同,它常常都是同步的(如除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

你可能感兴趣的:(数据结构,unix,user,代码分析)