问:

如何开中断和关中断

答:
中断是操作系统用于响应外部事件(如硬件中断)的一种机制。开中断和关中断的方法如下:
开中断:
1. 通过中断描述符表设置中断处理程序。中断描述符表(IDT)存储着所有中断的入口地址。我们可以设置一个中断的入口地址为我们定义的中断处理程序,这样当该中断触发时,CPU就会调用我们定义的中断处理程序。
2. 通过编程触发中断。我们可以通过编程主动触发一个中断,这样就会执行对应的中断处理程序。例如,我们可以调用中断指令INT n来触发中断号n对应的中断。
3. 让硬件触发中断。当硬件检测到某事件(如按键按下)时,它会主动触发对应的中断号,此时就会调用对应的中断处理程序。
关中断:
1. 清除中断描述符表对应的入口地址。我们可以将某中断的入口地址设置为空,这样当该中断触发时,由于IDT中没有对应的处理程序入口,所以CPU不会执行任何操作。
2. 临时屏蔽中断。我们可以使用中断屏蔽指令CLI来临时屏蔽所有的可屏蔽中断。也可以使用专门的屏蔽位来屏蔽某个具体的中断。当屏蔽结束后,中断会重新生效。
3. 禁用中断控制器。可以通过配置寄存器来禁用可编程中断控制器(PIC),防止它向CPU发送任何中断请求。这样所有外部中断都会被禁用。
开中断和关中断常用于以下情况:
1. 在中断处理程序执行期间防止其他中断干扰。可以在进入中断处理程序前关中断,处理完成后开中断。
2. 在关键代码段执行期间防止中断,提高执行效率。如在多线程加锁的临界区可以关中断。
3. 实现中断嵌套。通过开关中断可以实现中断处理程序被中断等嵌套现象。
4. 实现不同优先级的中断响应。通过开关中断可以实现响应高优先级中断,忽略低优先级中断的效果。
5. 在实时系统中实现线程抢占与调度。通过关中断可以实现临时屏蔽线程调度,实现线程的原子操作。