Linux中断处理机制
时间:2006-12-24 来源:linuxerworld
Linux 使用大量不同的硬件来完成许多不同的任务。显示设备驱动显示器,IDE 设备驱动磁盘等等。你可以同步地驱动这些设备,就是你可以发出一个请求执行一些操作(比如把一块内存写到磁盘)然后等待操作结束。这种方式,虽然可以工作,但是非常没有效率,操作系统当它等待每一个操作完成的时候会花费大量时间“忙于什么也不做”( busy doing nothing )。一个好的,更有效的方法是做出了请求然后去作其他更有用的事情,然后当设备完成请求的时候被设备中断。在这种方案下,系统中同一时刻可能有许多设备的请求在同时发生。
让设备中断 CPU 当前的工作必须有一些硬件的支持。大多数,如果不是所有的话,通用目的的处理器比如 Alpha AXP 都使用相似的方法。 CPU 的一些物理管脚的电路只要改变电压(例如从 +5V 到 -5V )就会让 CPU 停止正在做的工作,开始执行处理中断的特殊代码:中断处理代码。这些管脚之一可能连接一个内部适中,每一个 1000 分之一秒就接收一个中断,其他的也许连接到系统的其他设备,比如 SCSI 控制器。
系统通常使用一个中断控制器把设备的中断集合在一起,然后把信号传送到CPU 的一个单一的中断管脚。这可以节省 CPU 的中断管教,也给设计系统带来了灵活性。中断控制器有掩码和状态寄存器,用于控制这些中断。设置掩码寄存器的位可以允许和禁止中断,状态寄存器返回系统中当前的中断。
一些系统中的中断可能是硬连接的,例如实时时钟的内部时钟可能永久地连接到中断控制器的第 3 管脚。但是,另一些管脚连接什么可能由在特定的 ISA 或者PCI 槽位插入什么控制卡决定。例如,中断控制器的第 4 管脚可能和 PCI 槽位0 相连,可能某一天有一个以太网卡,当时后来可能是一块 SCSI 控制卡。每一个系统都有它自己的中断中转机制,操作系统必须足够灵活才能处理。
大多数现代的通用目的微处理器用相同的方式处理中断。发生硬件中断的时候, CPU 停止它正在运行的指令,跳到内存中一个位置运行,这里或者包含中断处理代码或者是跳到中断处理代码的指令。这种代码通常在 CPU 的特殊模式下工作:中断模式,通常,这种模式下其他中断不能产生。这里也有例外:一些