CMOS数据为何丢失?

Author: 辽宁 宋立波 Date: 1996-01-05

        在IBM兼容机上,系统的配置信息是由CMOS存储器来存储的。机器使用前要配置这些CMOS数据,系统在引导时还要读取这些CMOS数据,CMOS中的数据访问是通过两个I/O端口来实现的。端口70H是一个字节的只写端口,它用来设置CMOS中数据的地址;端口71H是用来读写由端口70H设置CMOS地址中的数据单元字节内容。
        使用端口70H和71H来读取和设置CMOS中的数据,如果处理不当可能会造成意想不到的结果。由于PC机系统是基于中断的,任何时刻程序中的控制权都有可能被其它中断夺走,例如,当程序中将地址端口70H设置为要读地址10H单元中的数据,在从71H数据端口读信息前系统进行了一次中断,如果引发的中断服务程序中需要读写CMOS中的数据,这样就会修改刚刚设置的地址端口的地址值,如将刚刚设置的10H改成了6CH。当程序重新获得控制权时,不可能知道刚刚设置的CMOS地址已经被修改了,这时如果读写71H端口就会出现错误。
        尽管在程序中可采取措施来预防上述情况的发生,如保存标志寄存器PUSHF、利用CLI屏蔽软中断、利用20H和21H端口来屏蔽硬中断以及将80H写入70H端口来禁止不可屏幕蔽中断NMI,再读写完70H和71H端口之后再重新开放上述中断,但由于有些80286处理器中有个缺陷,就是POPF恢复标志时在一小段时间内开放了系统中断。因此当执行的程序出现错误时,控制权就会转移到其它闲置的代码段中,那些闲置的代码段中很可能存在着读写CMOS数据的指令代码,而闲置代码中不会有上述的预防措施,即使有上述预防措施,但由于286系统中的缺欠控制权也可以被其它中断夺走,于是在286机器上执行未编制完善的应用程序造成死机现象后,会出现CMOS信息部分或全部丢失的现象。
        (辽宁  宋立波)