需要走的路还很长呀。。。。
分类: LINUX
2013-06-08 21:38:03
Linux内核管理硬件设备方式:
轮询总会周期性的重复执行,大量地耗用CPU 时间,因此效率及其低下。因此常采用第二种中断的方式管理硬件设备。
中断是一种电信号,由硬件设备产生,并直接送入中断控制器的输入引脚上,然后再由中断控制器向处理器发送相应的信号。处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断。此后,处理器会通知OS 已经产生中断。这样,OS 就可以对这个中断进行适当的处理。
说到中断,就不得不提到异常。异常为由处理器产生,当处理器执行到由于编程失误而导致的错误指令(如被0除)的时候,或者是在执行期间出现特殊情况(如缺页),必须靠内核来处理的时候,处理器就会产生一个异常。异常和中断不同在于:1.异常产生时要考虑和处理器时钟同步,而中断可以随时发生;2.异常不使用中断控制器也不能被屏蔽。
x86体系结构支持256种中断,即256个中断源。为了使处理器较容易地识别每种中断源,将它们从0到255编号,赋予一个中断类型码,用8位无符号整数表示。这个中断类型码就是中断向量。
在响应一个特定中断的时候,内核会执行一个函数,该函数就叫做中断服务例程(interrupt service routine,ISR)。产生中断的每个设备都有一个相应的中断服务例程,一个设备的中断服务例程是设备驱动程序的一部分,它在内核相应中断时被调用。
中断可能随时发生,中断发生时,处理器就得挂起正在处理的任务转而去执行中断处理例程。所以中断处理例程要执行的越快越好,以避免处理器上被挂起的重要任务长时间等待。所以中断服务例程分两部分:上半部分,下半部分。
u上半部分:接受中断后立即执行,但只做有严格时限的工作
u下半部分:在合适的实际去执行,大部分中断处理任务放到下半部分去完成。
注册中断服务例程
中断服务例程用于内核响应中断。中断服务例程要能被内核在响应中断时调用,先要进行注册,将自己挂到挂到中断请求队列中。函数request_irq()用于对中断服务例程进行注册,函数原型如下:
函数有五个参数,下面对函数request_irq()中的五个参数进行详细分析。
第一个参数:irq,无符号整型,表示要分配的中断号。