本發(fā)明屬于計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種自動(dòng)處理故障內(nèi)存條的方法。
背景技術(shù):
內(nèi)存條是服務(wù)器主板最重要的部件之一,主板上電啟動(dòng)以后,內(nèi)存資源還沒有被初始化,沒有內(nèi)存資源可以使用,程序在非易失性存儲(chǔ)介質(zhì)中緩慢運(yùn)行,為了能盡早獲取內(nèi)存資源,將程序復(fù)制到內(nèi)存中快速運(yùn)行,主板啟動(dòng)后,會(huì)優(yōu)先初始化內(nèi)存設(shè)備,把其他設(shè)備初始化工作放在后面。主板上,至少會(huì)配置一根內(nèi)存條,滿配時(shí)可以達(dá)到幾十根內(nèi)存條,主板逐一對每一根內(nèi)存條初始化,任何一根內(nèi)存條出現(xiàn)故障,都無法初始化完成,系統(tǒng)就會(huì)宕機(jī)。
主板上電啟動(dòng)后,進(jìn)行最必要的初始化后,就開始檢測內(nèi)存條是否正常,如果所有插入dimm插槽上的內(nèi)存條都是正常的,然后再檢查其他設(shè)備,例如顯示控制器等。在檢測內(nèi)存條過程中,如果檢測出沒有內(nèi)存條、有內(nèi)存條損壞或者有內(nèi)存條類型不被主板支持等錯(cuò)誤,bios將停止運(yùn)行,此時(shí)顯示控制器還沒有被檢測,因此顯示器不會(huì)被點(diǎn)亮。用戶所能看到的是主板已經(jīng)上電,風(fēng)扇旋轉(zhuǎn),但是顯示器不亮,鼠標(biāo)鍵盤無法使用,沒有故障點(diǎn)線索,這給用戶帶來了比較大的麻煩,需要逐一排查問題點(diǎn),即使排查到內(nèi)存條的問題,幾十根內(nèi)存條,逐條排查,整個(gè)過程需要耗費(fèi)大量時(shí)間,甚至需要設(shè)備廠商的技術(shù)支持才行。
技術(shù)實(shí)現(xiàn)要素:
針對以上技術(shù)問題,本發(fā)明公開了一種自動(dòng)處理故障內(nèi)存條的方法,系統(tǒng)不會(huì)因?yàn)榇嬖诠收蟽?nèi)存條而宕機(jī),不影響系統(tǒng)的正常使用,同時(shí)將故障內(nèi)存條通過指示燈進(jìn)行標(biāo)識,方便用戶排查故障內(nèi)存條進(jìn)行替換,大大降低了排查主板錯(cuò)誤的技術(shù)難度,簡單便捷,快速高效。
對此,本發(fā)明采用的技術(shù)方案為:
一種自動(dòng)處理故障內(nèi)存條的方法,每條dimm插槽對應(yīng)設(shè)置一個(gè)led指示燈,每個(gè)led指示燈的負(fù)極均接地,每個(gè)led指示燈的正極均與cpld連接,系統(tǒng)南橋pch通過gpio與cpld連接;系統(tǒng)在開機(jī)過程中,cpld將gpio信號解碼到對應(yīng)的dimm插槽狀態(tài),控制對應(yīng)dimm插槽的指示燈狀態(tài),并采用以下步驟自動(dòng)處理故障內(nèi)存條:
步驟s1,啟動(dòng)bios,對gpio進(jìn)行初始化;
步驟s2,初始化smi,初始化內(nèi)存控制器;
步驟s3,將當(dāng)前的處理器寄存器狀態(tài)進(jìn)行保存到存儲(chǔ)區(qū),逐一偵測各個(gè)dimm插槽內(nèi)的內(nèi)存條是否在位;如果該dimm插槽的內(nèi)存條在位,則將該dimm插槽對應(yīng)的led設(shè)置為閃爍,并注冊周期性smi程序,初始化該dimm插槽的內(nèi)存條;如果該dimm插槽的內(nèi)存條不在位,則將該dimm插槽對應(yīng)的led設(shè)置為不點(diǎn)亮;
步驟s4,如果dimm插槽內(nèi)的內(nèi)存初始化正常,通過cpld控制該dimm插槽對應(yīng)的led指示燈為點(diǎn)亮狀態(tài),清除保存在存儲(chǔ)區(qū)的處理器寄存器狀態(tài)數(shù)據(jù),卸載周期性內(nèi)存處理的smi程序;
如果內(nèi)存初始化在smi程序的周期時(shí)間間隔到來時(shí)未完成,則認(rèn)為內(nèi)存條初始化出現(xiàn)故障,周期性smi中斷觸發(fā),進(jìn)入smm系統(tǒng),執(zhí)行周期性內(nèi)存處理的smi程序,將該故障dimm插槽的內(nèi)存禁止,將dimm插槽的號碼n增加1,指向下一個(gè)dimm插槽,并讀取存儲(chǔ)區(qū)中的寄存器狀態(tài)的數(shù)據(jù),退出smi程序,將所有寄存器值恢復(fù)成存儲(chǔ)區(qū)讀取出來的寄存器的值;
步驟s5,重復(fù)步驟s3~步驟s4的內(nèi)容進(jìn)行下一個(gè)dimm插槽的內(nèi)存的檢查。
采用此技術(shù)方案,針對內(nèi)存條無法初始化完成,導(dǎo)致系統(tǒng)宕機(jī)的問題,給出了解決方案。主板初始化內(nèi)存條,發(fā)現(xiàn)有內(nèi)存條故障、內(nèi)存條類型不被支持等問題,軟件程序?qū)收蟽?nèi)存條進(jìn)行禁止,同時(shí)設(shè)置指示燈來表明對應(yīng)dimm內(nèi)存條出現(xiàn)故障,程序?qū)⑦M(jìn)行對下一根內(nèi)存條進(jìn)行初始化,直到所有內(nèi)存條初始化完成,啟動(dòng)系統(tǒng)。應(yīng)用此方法,系統(tǒng)不會(huì)因?yàn)榇嬖诠收蟽?nèi)存條而宕機(jī),不影響系統(tǒng)的正常使用,同時(shí)將故障內(nèi)存條通過指示燈進(jìn)行標(biāo)識,方便用戶排查故障內(nèi)存條進(jìn)行替換,大大降低排查主板錯(cuò)誤的技術(shù)難度,簡單便捷,快速高效。
作為本發(fā)明的進(jìn)一步改進(jìn),所述系統(tǒng)南橋pch通過led片選gpio、led控制gpio與cpld連接;步驟s1中,對gpio進(jìn)行初始化后將led片選gpio、led控制gpio設(shè)置為輸出功能。
作為本發(fā)明的進(jìn)一步改進(jìn),步驟s3中,所述逐一偵測各個(gè)dimm插槽內(nèi)的內(nèi)存條是否在位是通過bios讀取dimm插槽的spd數(shù)據(jù),來檢測dimm插槽內(nèi)存條的在位狀態(tài);如果能正常獲取有效的spd數(shù)據(jù),表明dimm的內(nèi)存條在位,如果不能獲取有效spd數(shù)據(jù),表明dimm插槽上沒有內(nèi)存條在位,并根據(jù)dimm插槽的序號n值,來設(shè)置該dimm插槽對應(yīng)的led片選gpio的輸出電平值,傳送給cpld處理,將該dimm插槽對應(yīng)的led設(shè)置為不點(diǎn)亮。
作為本發(fā)明的進(jìn)一步改進(jìn),如果該dimm插槽的內(nèi)存條不在位,則將該dimm插槽對應(yīng)的led片選gpio設(shè)置為低電平,傳送給cpld處理,將該dimm插槽對應(yīng)的led設(shè)置為不點(diǎn)亮;清除存儲(chǔ)區(qū)存儲(chǔ)的處理器寄存器狀態(tài)數(shù)據(jù),接下來判斷是否周期性內(nèi)存處理的smi程序已經(jīng)注冊,如果有,就將周期性smi程序卸載掉,如果沒有,繼續(xù)檢測是否所有dimm插槽都完成在位檢測。
作為本發(fā)明的進(jìn)一步改進(jìn),步驟s3中,所述處理器寄存器包括cs和ip兩個(gè)寄存器。
作為本發(fā)明的進(jìn)一步改進(jìn),步驟s5還包括判斷是否所有dimm插槽的內(nèi)存檢查完畢,如果檢查完畢,程序結(jié)束;如果還有dimm插槽的內(nèi)存未檢查完成,循環(huán)執(zhí)行步驟s3~步驟s4的內(nèi)容進(jìn)行下一個(gè)dimm插槽的內(nèi)存的檢查。
作為本發(fā)明的進(jìn)一步改進(jìn),所述dimm插槽的數(shù)量為n,所述led指示燈的數(shù)量為n,所述led片選gpio的數(shù)量為x,其中x=log2n;所述led控制gpio為1個(gè)。
作為本發(fā)明的進(jìn)一步改進(jìn),所述smi程序的周期為dimm插槽的內(nèi)存初始化需要的時(shí)間與預(yù)留余量時(shí)間之和。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果為:
采用本發(fā)明的技術(shù)方案,主板初始化內(nèi)存條,發(fā)現(xiàn)有內(nèi)存條故障、內(nèi)存條類型不被支持等問題,軟件程序?qū)收蟽?nèi)存條進(jìn)行禁止,通過設(shè)置的指示燈來指示對應(yīng)出現(xiàn)故障的dimm內(nèi)存條,且程序?qū)⑦M(jìn)行對下一根內(nèi)存條進(jìn)行初始化,直到所有內(nèi)存條初始化完成,啟動(dòng)系統(tǒng)。應(yīng)用此方法,解決了現(xiàn)有技術(shù)內(nèi)存條故障無法完成初始化,導(dǎo)致系統(tǒng)宕機(jī)的問題;系統(tǒng)不會(huì)因?yàn)榇嬖诠收蟽?nèi)存條而宕機(jī),不影響系統(tǒng)的正常使用,同時(shí)將故障內(nèi)存條通過指示燈進(jìn)行標(biāo)識,方便用戶排查故障內(nèi)存條進(jìn)行替換,大大降低排查主板錯(cuò)誤的技術(shù)難度,簡單便捷,快速高效。
附圖說明
圖1是本發(fā)明一種實(shí)施例的主板硬件部分改進(jìn)的結(jié)構(gòu)示意圖。
圖2是本發(fā)明一種自動(dòng)處理故障內(nèi)存條的方法的流程圖。
具體實(shí)施方式
下面對本發(fā)明的較優(yōu)的實(shí)施例作進(jìn)一步的詳細(xì)說明。
一種自動(dòng)處理故障內(nèi)存條的方法,其包括硬件設(shè)計(jì)部分和bios程序部分。
如圖1所示,硬件設(shè)計(jì)上,將主板上每一根dimm插槽旁邊放置一個(gè)發(fā)光二極管,作為指示燈,用以表示dimm插槽上內(nèi)存條的狀態(tài),有n個(gè)dimm插槽就用n個(gè)發(fā)光二極管,所有發(fā)光二極管負(fù)極統(tǒng)一接地,每個(gè)發(fā)光二極管的正極都連接到cpld的pin上面,n個(gè)發(fā)光二極管對應(yīng)n個(gè)cpldpin角,n個(gè)dimm,需要x個(gè)gpio進(jìn)行片選,2x=n,x=log2n,例如有32根dimm,需要片選gpio的數(shù)量x=log232=5,再加上一個(gè)指示燈控制gpio,就是6個(gè)gpio,這6個(gè)gpio從pch,連接到cpld,每次當(dāng)軟件設(shè)置完gpio后,cpld將gpio信號解碼到對應(yīng)的dimm插槽和控制指示燈狀態(tài)。使用cpld來解碼gpio控制片選dimm插槽和指示燈控制,節(jié)省了pchgpio的用量,避免當(dāng)幾十根dimm時(shí),gpio數(shù)量不夠的情況,而cpld解碼僅僅是很小的一個(gè)邏輯功能,不會(huì)影響cpld的其他功能運(yùn)用。
如圖2所示,bios程序采用以下步驟:
bios啟動(dòng)以后,首先對gpio進(jìn)行初始化,將使用到的gpio設(shè)置為輸出功能,接著初始化smi,使smi中斷觸發(fā)后,中斷程序正常使用,接著對內(nèi)存控制器進(jìn)行初始化。接下來的步驟,應(yīng)該是逐一偵測內(nèi)存條是否在位,然后進(jìn)行初始化的過程了,在進(jìn)行這一步驟之前,首先對當(dāng)前的處理器寄存器狀態(tài)進(jìn)行保存到存儲(chǔ)區(qū),其中最重要的是cs和ip兩個(gè)寄存器,這兩個(gè)寄存器保存著處理器的正在運(yùn)行指令的指針。開始讀取dimmn內(nèi)存條的spd,如果能正常獲取有效spd數(shù)據(jù),表明dimm上有內(nèi)存條在位,如果不能獲取有效spd數(shù)據(jù),表明dimm上沒有內(nèi)存條在位,根據(jù)n值,來設(shè)置片選gpio的輸出電平值,傳送給cpld處理,來選擇dimmn的指示燈來控制。如果判斷dimmn不在位,將指示燈控制gpio設(shè)置為低電平,傳遞給cpld處理,讓cpld將指示燈熄滅,清除存儲(chǔ)區(qū)存儲(chǔ)的處理器寄存器狀態(tài)數(shù)據(jù),接了來判斷是否有周期性內(nèi)存處理的smi程序已經(jīng)注冊,如果有,就將周期性smi程序卸載掉,如果沒有繼續(xù)執(zhí)行,檢測是否所有dimm都完成。如果判斷dimmn在位,將指示燈控制gpio設(shè)置為閃爍狀態(tài),傳遞給cpld處理,讓cpld設(shè)置指示燈為閃爍,接下來注冊周期性內(nèi)存處理的smi程序,smi程序的周期間隔是經(jīng)驗(yàn)值,根據(jù)實(shí)際每根dimm初始化需要的時(shí)間,再預(yù)留一定余量來設(shè)置,注冊完成以后,開始初始化dimmn內(nèi)存條,這里出現(xiàn)兩個(gè)分支,如果初始化正常,內(nèi)存條沒有故障,將指示燈控制gpio設(shè)置為高電平,傳遞給cpld處理,讓指示燈點(diǎn)亮,表明內(nèi)存條是正常的,清除保存在存儲(chǔ)區(qū)的處理器寄存器狀態(tài)數(shù)據(jù),卸載周期性內(nèi)存處理的smi程序,檢測是否所有dimm都完成,如果內(nèi)存初始化在周期性smi程序時(shí)間間隔到來是未完成,程序認(rèn)為內(nèi)存條初始化出現(xiàn)故障,周期性smi中斷觸發(fā),進(jìn)入smm系統(tǒng),執(zhí)行周期性內(nèi)存處理的smi程序,在程序里面,將故障dimmn禁止掉,將dimm號碼n增加1,指向下一個(gè)dimm,讀取在存儲(chǔ)區(qū)保存的處理器寄存器狀態(tài)數(shù)據(jù),使用這些數(shù)據(jù)修改替換掉進(jìn)入smm系統(tǒng)時(shí)保存在smram里的處理器寄存器狀態(tài)數(shù)據(jù),退出smm系統(tǒng),因?yàn)閟mram里的處理器狀態(tài)信息數(shù)據(jù)已經(jīng)被替換了,尤其是表示處理器執(zhí)行當(dāng)前指令cs和ip寄存器,,所以處理器返回的位置將會(huì)跳到保存處理器寄存器數(shù)據(jù)的位置,在這里繼續(xù)執(zhí)行,對下一個(gè)dimm內(nèi)存條進(jìn)行處理。判斷是否所有dimm檢查完畢,如果檢查完畢,程序結(jié)束,如果還有dimm未檢查完成,循環(huán)執(zhí)行上面的程序流程。
本發(fā)明中所涉及的英文縮寫解釋如下:
pch(platformcontrollerhub):intel公司的集成南橋
bios(basicinputoutputsystem):基本輸入輸出系統(tǒng),主要用于計(jì)算機(jī)開機(jī)過程中各種硬件設(shè)備的初始化和檢測
gpio(generalpurposeinputoutput):通用輸入/輸出.
dimm(dualinlinememorymodules):雙列直插式存儲(chǔ)模塊,即通??吹降闹靼迳厦娴膬?nèi)存條。.
smi(systemmanagementinterrupt):系統(tǒng)管理中斷;
smm(systemmanagementmode):系統(tǒng)管理模式。
smram(systemmanagementram):系統(tǒng)管理內(nèi)存。
cpld(complexprogrammablelogicdevice):復(fù)雜可編程邏輯器件。
以上內(nèi)容是結(jié)合具體的優(yōu)選實(shí)施方式對本發(fā)明所作的進(jìn)一步詳細(xì)說明,不能認(rèn)定本發(fā)明的具體實(shí)施只局限于這些說明。對于本發(fā)明所屬技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干簡單推演或替換,都應(yīng)當(dāng)視為屬于本發(fā)明的保護(hù)范圍。