优化内存不当引起的软故障一例
一台compaq486/50电脑,在使用用Foxbase编的一套工资系统软件时,系统其他模块运行都正常,但运行打印模块时,只能打印一行,接着就会死机,按Ctrl+Alt+Del也不能热启动。运行英汉通4.2软件,驻留内存后一旦被激活,也会引起死机。但运行别的软件都正常,在DOS下用dir>prn命令和在WPS中都能正常打印。
#3 故障分析与排除:
首先用KV300软件查毒,没有发现病毒,再检查打印模块的程序,也完全正常,程序一点没有被改动。这样基本上就只有一种可能了,那就是内存中有程序相互冲突,一运行打印模块就会引起冲突,但检查内存发现没有驻留什么别的软件,这时真有点束手无策了。最后突然想到不久以前曾对这台机器进行了内存优化,是否内存优化占用了不该占用的内存段?检查config.sys,发现device=c:\dos\emm386.exe noems highscan后还有i=b000-b7ff和i=c700-c7ff两个参数,将这两个参数删除,重新启动,再运行工资系统的打印模块及英汉通4.2软件均能正常运行了。后来经过进一步探索发现,引起故障的只是i=c700-c7ff这个参数,保留i=b000-b7ff不会引起故障。用MSD检测发现c700-c7ff内存段位从c000开始的Video Rom BIOS旁,虽然从MSD中看到c700-c7ff段不是ROM,但用MSD检测显示此段available,可被当作UMB(上位内存)使用。如果此段真的被强制占用,当运行一些软件的特殊显示而用到此内存段时,就会产生冲突。而使用的那套工资系统用到了大量的UCDOS特显功能,在启动UCDOS的同时,也启动了tx这个软件,而这个软件在打印时要用到c700-c7ff内存段,当此内存段被强制占用,就会产生冲突,引起死机。英汉通4.2也是这样,因为英汉通软件在此台机器中也要把c700-c7ff内存段当作显示缓冲内存使用。
#3 小结:
从以上可以看出,优化内存时不能太贪心,有的内存段有时被强制作为UMB来使用,可能运行大部分软件都没事,但当运行的软件需要用此内存段时,就会引发一些不可预测的后果。