中断窗口



我的问题是,为什么需要在下面的汇编序列中禁止中断?中断不会只是保存所有寄存器并在完成后将它们恢复,这样就不会丢失数据吗?

cli   
inb (%dx), %al  
orb  $0x01, %al  
outb %al, (%dx)  
sti

中断不会只是保存所有 注册并在之后将其带回 完成,所以没有数据丢失?

是的,会的。但是,某些 I/O 端口对时间敏感,如果读/写序列中断,可能无法正常工作。或者中断以某种方式影响端口(例如,您正在读取UART寄存器并且一个字符到达,触发串行中断并更改UART状态)。或者,您可以写入本身与中断处理相关的端口(例如中断控制器)。如果没有更多细节,很难说是否真的有必要,但总的来说,安全总比后悔好。

在这种特殊情况下,您正在从端口读取一个值,更改一位,然后再次写出它。要作为读取-修改-写入循环,代码必须不间断。

否则,如果在此序列中发生另一个中断,并更改了另一个位,则在继续时将覆盖该更改。不好!

最新更新