淺談CMOS
大家都知道,在286以上的計算機中,一般都有一個CMOS RAM電路,它用於關機以後繼續存放日期、時間、內存設置、軟硬盤類型及其他許多有用的設置信息。CMOS即互補金屬氧化物半導體,它的設置、應用和管理是保證係統正常工作的關鍵,下麵就介紹一些有關CMOS的基本概念和應用。
ROM BIOS和CMOS RAM芯片
ROM BIOS是固化在ROM中的BIOS(Basic Input/Output System,簡稱基本輸入/輸出係統),他控製著係統全部硬件的運行,又為高層軟件提供基層調用,BIOS芯片是插在主板上的一個長方形芯片。其比較著名的生產廠家有:American Megatrends INC.的AMI BIOS和Award Software INC.的AWARD BIOS。存放在ROM BIOS中的內容是不能被用戶修改的,它主要用於存放:自診斷測試程序、係統自舉裝入程序、係統設置程序和主要I/O設備的I/O驅動程序及中斷服務程序。自診斷測試程序:它通過讀取係統主板上CMOS RAM中的內容來識別係統硬件的配置,並根據這些配置信息對係統中的各個部件進行自檢和初始化。在POST(Power―On Self加電自檢)過程中,如果CMOS RAM中的設置參數與係統實際配置的硬件不符,就會導致係統不能啟動或不能正常工作。係統自舉裝入程序:該程序在係統自檢正確後將操作係統盤的引導記錄讀入內存,然後由引導程序安裝操作係統的核心程序。係統設置程序:在係統引導後,適時用熱鍵(如Del)啟動設置程序(SETUP),在這個設置程序中可對軟硬件參數進行設置,然後由其存入CMOS RAM中。一般地,當係統第一次加電;係統增加、減少或更換硬件;CMOS RAM因掉電、病毒、放電等原因造成內容丟失;係統因需要而調整某些設置參數等原因時需要運行SETUP程序。常見的SETUP程序有AMI BIOS SETUP、AWARD BIOS SETUP、AMI WINBIOS SETUP、QUADTEL BIOS SETUP等。主要I/O設備的I/O驅動程序及中斷服務程序:主要為計算機的低端輸入/輸出和各種中斷提供服務。
CMOS RAM是一種互補金屬氧化物半導體隨即存儲器,它主要具有功耗低(每位約10毫微瓦)、可隨機讀取或寫入數據、斷電後用外加電池來保持存儲器的內容不丟失、工作速度比動態隨機存儲器(DRAM)高等特點。ROM BIOS對係統自檢初始化後,將係統自檢到的配置與CMOS RAM中的參數進行比較,在早期的PC中,用主板上的一組DIP開關(以不同組合來代表係統硬件資源的配置情況)來完成現在的CMOS RAM功能,在286以後則基本全都采用了CMOS RAM來保存係統設置的參數。CMOS RAM一般為64字節或128字節,用可充電的電池或外接電池(286機器用幹電池較多,386以上的機器基本上都用充電電池了)對CMOS RAM芯片供電。
CMOS基本應用
CMOS數據的備份:由於CMOS的數據是否正確關係到係統是否能正常啟動,所以對CMOS數據進行定期備份是非常重要的。備份的最簡單方法是在SETUP程序中,用筆把各個參數記下來或者用屏幕硬拷貝(按Print Screen鍵)的方法把各個設置界麵打印出來。這裏介紹一種用程序把數據備份下來的方法(以AMI BIOS為例,這些方法對其他的CMOS也適用;用Turbo C 2.0,下同):
/*把CMOS中的數據讀到A盤的CMOS.DAT文件中*/
#include "stdio.h"
main()
{ char cmos[64];FILE *fp;int i;
for (i=0;i<64;i++)
{ outportb(0x70,i);
cmos[i]=inportb(0x71);
}
fp=fopen("A:\CMOS.DAT","wb");
fwrite(&cmos[0],1,64,fp);
fclose(fp);
}
CMOS數據的恢複:文件CMOS.DAT的內容可以在GEBUG(或PCTOOLS等工具軟件)中顯示和編輯,也可將其再寫回CMOS,這裏給出自動寫回數據的程序:
/*把A盤CMOS.DAT文件的數據寫回CMOS中*/
#include "stdio.h"
main()
{ char cmos[64];FILE *fp;int i;
fp=fopen("A:\CMOS.DAT","rb");
fread(&cmos[0],1,64,fp);
for (i=0;i<64;i++)
{ outportb(0x70,i);
outportb(0x71,cmos[i]);
}
fclose(fp);
}
破譯或摧毀CMOS口令:由於各種原因,有時需要破譯或者摧毀CMOS的口令,此時可以根據具體情況采取各種不同的方法。如果能啟動係統,但由於忘記或不知CMOS口令而無法進入CMOS設置狀態,此時可采用程序法來破譯CMOS的口令(由於程序較長,這裏省略,如那位朋友有興趣請Mail to:zuiyue@263.net)。用程序摧毀CMOS密碼的設置:
/*摧毀CMOS密碼*/
#include <dos.h>
void far (*p)()=MK_FP(0xffff,0x0000);
main()
{ int i;
for (i=0x34;i<0x40;i++) outp(0x70,i);
out(0x71,0);
(*p)();
}
用DEBUG向端口發送數據的O命令向端口70h和71h發送一個數據,也可以清除CMOS的設置,具體操作如下:
C:\>DEBUG
―O 70 10
―O 71 01
―Q
另外,也可以把上述操作用DEBUG寫成一個程序放在一個文件(如DELCMOS.COM)中,具體操作如下:
C:\>DEBUG
―A 100
XXXX:0100 MOV DX,70
XXXX:0103 MOV
XXXX:0105 OUT
XXXX:0106 MOV DX,71
XXXX:0109 MOV
XXXX:010B OUT
XXXX:
―R CX
CX 0000
:
―N DELCMOS.COM
―W
Writing
―Q
以後,隻要能用軟盤啟動係統,運行DELCMOS.COM就能取消CMOS的設置。CMOS放電。如果由於人為原因或由於機器故障使CMOS被破壞,而又不能用軟盤啟動係統,即係統引導順序為“C:,A:”,或者Floppy Drive A:設置為Not Installed(或Disabled),係統不認A驅,這是便隻有放電一途了。放電的方法有電池短接法、跳線短接法和芯片放電法。電池短接法:如果利用可拆卸電池供電,可以把電池拔下,用一根導線將電池插座兩端短路,對電路中的電容放電,使CMOS RAM中的信息被清除;如果電池被焊死在主板上,就必須用電烙鐵和吸錫器拔開電池的一個管腳來放電。需說明的是,電池短接法必須在短電的情況下進行,此法對一般用戶是不可取的,因為拆卸和焊接電池時可能造成主板的損壞、短路、斷路等問題,建議用下麵的跳線短接法給CMOS放電。跳線短接法:在電池附近有一個跳線開關,跳線旁邊注有RESET CMOS、CLEAN CMOS、CMOS CLOSE或CMOS RAM RESET等字樣,跳線開關一般為四腳,有的在1、2兩腳上有一個跳接器,此時將其拔下接到2、4腳上即可放電;有的所有腳上都沒有跳接器,此時將2腳於充電電容短接即可放電。芯片短接法:開機後運行CMOS