,賈凡2
(1.南京理工大學(xué) 計(jì)算機(jī)科學(xué)與工程學(xué)院,南京 210094; 2.北京航天測(cè)控技術(shù)有限公司,北京 100041; 3.龍芯中科技術(shù)有限公司,北京 100095)
目前,龍芯處理器已廣泛應(yīng)用于航空、航天、裝備、測(cè)控、通信等關(guān)鍵領(lǐng)域,作為支撐國(guó)家信息化、智能化戰(zhàn)略的重要核心部件,在這些關(guān)鍵領(lǐng)域?qū)崿F(xiàn)了國(guó)產(chǎn)化替代,保障了國(guó)家重大工程的核心自主和安全運(yùn)行。在上述關(guān)鍵領(lǐng)域中,常面向惡劣環(huán)境,存在長(zhǎng)期工作、高密度計(jì)算等關(guān)鍵性應(yīng)用要求,對(duì)元器件、主板的可靠性提出了嚴(yán)苛的要求,這就需要在確保硬件高可靠的同時(shí)加強(qiáng)設(shè)備自檢測(cè)和故障自診斷設(shè)計(jì),從而保證故障實(shí)時(shí)定位、實(shí)時(shí)診斷,直至實(shí)現(xiàn)在線修復(fù)和無(wú)人維護(hù),確保關(guān)鍵設(shè)備高可靠運(yùn)行。
在特種應(yīng)用領(lǐng)域中,電子產(chǎn)品面向的惡劣環(huán)境如: 高溫、低溫、震動(dòng)、鹽霧等環(huán)境,因此主板設(shè)計(jì)時(shí)關(guān)鍵器件一般采用板貼設(shè)計(jì)以提高可靠性,這為關(guān)鍵器件的維修和定位帶來(lái)了挑戰(zhàn),比如內(nèi)存。商用機(jī)器一般選用的內(nèi)存條類(lèi)型有:SO-DIMM、R-DIMM、U-DIMM,當(dāng)機(jī)器的內(nèi)存出故障時(shí),僅通過(guò)逐一替換內(nèi)存條的方法就可以排除故障內(nèi)存;而對(duì)于加固計(jì)算機(jī)主板,由于內(nèi)存顆粒直接焊接在主板上,相關(guān)標(biāo)準(zhǔn)對(duì)主板的同一器件維修的換焊次數(shù)要求不大于3次,這些條件限制了內(nèi)存顆粒的維修不能像商用機(jī)器維修那樣通過(guò)簡(jiǎn)單的替換和測(cè)試的方法進(jìn)行,需要提供軟件定位的方法,確定故障器件后再進(jìn)行焊接維修。
加固計(jì)算機(jī)主板的成本高昂,按質(zhì)量規(guī)范要求,出現(xiàn)故障后需要準(zhǔn)確地定位問(wèn)題,不允許反復(fù)維修。 龍芯的產(chǎn)品線齊全,品類(lèi)豐富,提供了各種應(yīng)用領(lǐng)域所需要的解決方案,其中龍芯3號(hào)系列處理器是面向桌面、高端嵌入式和服務(wù)器應(yīng)用的多核處理器[1]。龍芯3號(hào)計(jì)算機(jī)主板如果外接冷板、散熱片或加三防漆等,導(dǎo)致硬件一旦出現(xiàn)故障,通過(guò)測(cè)量信號(hào)等方式定位問(wèn)題的難度大幅度提高。因此通過(guò)基本輸入輸出系統(tǒng)(basic input output system,BIOS)一組固化到主板上一個(gè) ROM 芯片上的程序[2],通常稱為固件,并結(jié)合硬件增加內(nèi)建調(diào)試模塊來(lái)對(duì)板卡故障進(jìn)行診斷是最為高效、便捷的。
綜上所述,提高主板自檢測(cè)、自診斷能力已成為提高全國(guó)產(chǎn)信息化硬件可靠性和保障性的迫切要求,也是未來(lái)信息系統(tǒng)智能化無(wú)人化發(fā)展的需要。
現(xiàn)代的無(wú)內(nèi)部互鎖流水級(jí)(microprocessor without interlocked pipelined stages,MIPS) 處理器提供一定的硬件支持來(lái)協(xié)助開(kāi)發(fā)人員[3]。龍芯3號(hào)計(jì)算機(jī)模塊的硬件設(shè)計(jì)抽象圖如圖1所示。
圖1 龍芯3號(hào)計(jì)算機(jī)硬件設(shè)計(jì)方案
龍芯3號(hào)CPU對(duì)外接口采用擴(kuò)展的HT協(xié)議,既可用于實(shí)現(xiàn)外部設(shè)備連接,又可實(shí)現(xiàn)多芯片互聯(lián)[4]。HT是系統(tǒng)級(jí)的總線,IO多指南北橋芯片,多芯片互聯(lián)是指與多個(gè)龍芯3號(hào)互聯(lián),即在同一塊主板上構(gòu)建2路或4路CC-NUMA(Cache-coherent non-uniform memory access architecture:高速緩存相關(guān)的非一致性內(nèi)存訪問(wèn),是一種用于多處理器的電腦記憶體設(shè)計(jì))系統(tǒng)。龍芯 7A1000 橋片(后文簡(jiǎn)稱為橋片)是龍芯的第一款專(zhuān)用橋片組產(chǎn)品,目標(biāo)是替代 AMDRS780+SB710 橋片組,為龍芯處理器提供南北橋功能。橋片通過(guò) HT 高速總線接口與龍芯3 號(hào)系列處理器相連,一旦HT總線互聯(lián)出現(xiàn)故障,將導(dǎo)致系統(tǒng)無(wú)法啟動(dòng)[5]。
內(nèi)存作為計(jì)算機(jī)中重要的部件之一,內(nèi)存的穩(wěn)定運(yùn)行決定了計(jì)算機(jī)能否穩(wěn)定運(yùn)行。內(nèi)存是指能夠按照處理器的訪問(wèn)粒度進(jìn)行隨機(jī)訪問(wèn)的存儲(chǔ)器[6]。系統(tǒng)中常見(jiàn)的靜默錯(cuò)誤,即程序使用了有錯(cuò)誤的內(nèi)存,將會(huì)造成程序跑飛或者得到錯(cuò)誤的運(yùn)行結(jié)果,如果在裝備類(lèi)應(yīng)用中出現(xiàn)此類(lèi)錯(cuò)誤將導(dǎo)致無(wú)法預(yù)估的損失。作為程序運(yùn)行的載體,內(nèi)存的穩(wěn)定性以及內(nèi)存故障調(diào)試與故障定位是計(jì)算機(jī)所有調(diào)試模塊中最基礎(chǔ)和重要的部分。近年來(lái),隨著芯片工藝水平的顯著提升,內(nèi)存中一個(gè)最小比特位存儲(chǔ)單元所占的體積越來(lái)越小。而隨著芯片密度的增加,內(nèi)存芯片內(nèi)部更容易受到因高溫、射線輻射、劇烈振動(dòng)、灰塵等外部因素的影響而出現(xiàn)損壞,導(dǎo)致數(shù)據(jù)存儲(chǔ)錯(cuò)誤。這些錯(cuò)誤一般是因?yàn)閮?nèi)存單元中某個(gè)和多個(gè)bit位發(fā)生翻轉(zhuǎn)造成的,這些損壞一般不可逆,調(diào)試內(nèi)存穩(wěn)定性等參數(shù)無(wú)效,必需更換內(nèi)存顆粒才能解決問(wèn)題。
根據(jù)故障診斷需求和龍芯開(kāi)源軟件的現(xiàn)狀,基于PromMonitor(PMON,龍芯處理器的BIOS)在實(shí)現(xiàn)龍芯固件規(guī)范要求的軟硬件初始化要求的基礎(chǔ)上增加故障診斷功能模塊。
PMON上電啟動(dòng)流程如圖2所示。
圖2 PMON上電啟動(dòng)流程
BIOS故障診斷設(shè)計(jì)主要包括HT鏈路鏈接問(wèn)題故障診斷(位于PMON上電啟動(dòng)流程[3]階段)和內(nèi)存問(wèn)題故障診斷(位于PMON上電啟動(dòng)流程[5])?;邶埿?號(hào)系列的CPU計(jì)算機(jī)模塊的上電自檢流程,結(jié)合HT和內(nèi)存兩種常見(jiàn)故障,設(shè)計(jì)了HT和內(nèi)存故障的診斷實(shí)現(xiàn)方法,并對(duì)HT故障實(shí)現(xiàn)可靠性增強(qiáng)設(shè)計(jì),以期幫助用戶快速發(fā)現(xiàn)故障、準(zhǔn)確定位問(wèn)題的目的。
龍芯3號(hào)板卡啟動(dòng)過(guò)程中出現(xiàn)故障,其故障故障樹(shù)如圖3所示。
圖3 主板啟動(dòng)故障樹(shù)
龍芯3號(hào)處理器主板啟動(dòng)故障跟軟硬件均相關(guān),硬件相關(guān)的問(wèn)題包括電源、復(fù)位、時(shí)鐘和取指,一般采用指示燈的做法進(jìn)行故障指示。HT控制器是可編程器件,需要軟件對(duì)其進(jìn)行工作模式配置后才可以正常訪問(wèn)所連接的設(shè)備,出現(xiàn)問(wèn)題可分為軟件配置問(wèn)題及硬件配置問(wèn)題。內(nèi)存控制器與HT類(lèi)似,需要軟件正確配置其工作模式才可能正常訪問(wèn)內(nèi)存設(shè)備,出現(xiàn)問(wèn)題的模式分為:地址線問(wèn)題、數(shù)據(jù)線問(wèn)題、控制線問(wèn)題及顆粒問(wèn)題。下文對(duì)每種故障分別進(jìn)行描述。
開(kāi)機(jī)啟動(dòng),模塊上電,電源按照設(shè)計(jì)的電源時(shí)序完成各級(jí)電源的上電,本方案設(shè)置了3個(gè)指示燈用于指示上電過(guò)程,第一個(gè)指示燈指示外部電源接入,第二個(gè)指示燈指示Standby域上電完成,最后一個(gè)電源指示燈指示所有電源上電完成。板卡使用過(guò)程可根據(jù)3個(gè)指示燈的狀態(tài)來(lái)判斷模塊上電過(guò)程是否有異常,異常電源屬于哪個(gè)電源域。
上電完成后,開(kāi)始板上電路的復(fù)位操作,可根據(jù)復(fù)位指示燈觀測(cè)模塊復(fù)位是否正常,正常情況為上電后復(fù)位指示燈點(diǎn)亮,完成復(fù)位后指示燈熄滅。其它狀態(tài)為復(fù)位異常。
CPU的取指是否正常關(guān)系到能否啟動(dòng)BIOS。當(dāng)一個(gè)計(jì)算機(jī)系統(tǒng)通電以后,它會(huì)運(yùn)行存儲(chǔ)在閃存中的固件[7]。龍芯3號(hào)處理器從3A2000之后都支持SPI取指,為了便于板卡啟動(dòng)故障定位,除了電源指示燈以及復(fù)位指示燈,CPU的BIOS芯片片選引腳接有一個(gè)取指指示燈用于指示CPU是否有取指操作。正常情況模塊完成復(fù)位后CPU會(huì)發(fā)起取指操作[8],取址指示燈在CPU取址過(guò)程會(huì)閃爍,取址完成后熄滅,其他狀態(tài)為取址異常。
HT問(wèn)題主要表現(xiàn)為HT互聯(lián)故障,可能原因有硬件配置問(wèn)題:如互聯(lián)頻率設(shè)置過(guò)高,HT總線電壓過(guò)高或過(guò)低,HT工作模式設(shè)置錯(cuò)誤等;軟件配置問(wèn)題:HT頻率設(shè)置過(guò)高。啟動(dòng)過(guò)程中HT總線的建鏈過(guò)程分為兩個(gè)階段:第一階段是按照硬件默認(rèn)頻率進(jìn)行建鏈;第二階段是HT復(fù)位后,按照軟件配置的HT頻率以及工作模式進(jìn)行建鏈。板卡啟動(dòng)過(guò)程中常見(jiàn)的HT故障一般為第二階段,故障排查方法詳見(jiàn)第2章。
板卡啟動(dòng)故障、運(yùn)行過(guò)程中系統(tǒng)或應(yīng)用程序跑飛、運(yùn)行測(cè)試程序結(jié)果不符合預(yù)期、網(wǎng)絡(luò)DMA數(shù)據(jù)規(guī)律報(bào)錯(cuò)等情況,均可能是內(nèi)存問(wèn)題導(dǎo)致的系統(tǒng)穩(wěn)定性問(wèn)題,造成數(shù)據(jù)讀或?qū)戝e(cuò)誤,從而影響程序運(yùn)行結(jié)果的正確性。
內(nèi)存存儲(chǔ)單元是按照行、列來(lái)組織的,對(duì)內(nèi)存的尋址是通過(guò)Bank地址,行地址和列地址進(jìn)行的[9]。常見(jiàn)的內(nèi)存問(wèn)題有:地址線問(wèn)題,控制線問(wèn)題,數(shù)據(jù)線問(wèn)題,內(nèi)存顆粒本身的問(wèn)題。
1)對(duì)于控制線問(wèn)題,包括時(shí)鐘,片選信號(hào)等,如果控制線故障,內(nèi)存訓(xùn)練是無(wú)法正常完成的,這里需要硬件參與定位。
2)地址線問(wèn)題:若地址線問(wèn)題,在內(nèi)存測(cè)試中,會(huì)出現(xiàn)間隔固定地址段,對(duì)內(nèi)存的讀寫(xiě)內(nèi)容完全相同,形成內(nèi)容回繞的現(xiàn)象,可以根據(jù)錯(cuò)誤規(guī)律即間隔地址空間的大小推算哪根地址線錯(cuò)誤。
3)數(shù)據(jù)線問(wèn)題及內(nèi)存顆粒本身問(wèn)題:在內(nèi)存測(cè)試時(shí)都有可能表現(xiàn)為內(nèi)存固定數(shù)據(jù)位錯(cuò)誤。
由于龍芯3號(hào)處理器中集成了2個(gè)內(nèi)存控制器,每個(gè)內(nèi)存控制器上可以接2個(gè)片選,對(duì)于雙路或四路計(jì)算機(jī)模塊,內(nèi)存連接更是復(fù)雜。已無(wú)法根據(jù)上述方法直接定位出哪個(gè)CPU的哪個(gè)內(nèi)存控制器的數(shù)據(jù)線或內(nèi)存顆粒故障,詳細(xì)故障定位方法見(jiàn)第3章。
主板產(chǎn)品應(yīng)用的統(tǒng)計(jì)數(shù)據(jù)顯示,高質(zhì)量等級(jí)的龍芯3號(hào)主板在生產(chǎn)、調(diào)試、維修保障過(guò)程中最常見(jiàn)的故障種類(lèi)包括兩類(lèi):HT互聯(lián)故障和內(nèi)存故障,兩者之和約占維修總數(shù)量的80%以上。因此通過(guò)自動(dòng)手段快速定位診斷這兩類(lèi)故障就成為提升主板故障維修效率的關(guān)鍵。
針對(duì)上述兩種故障模式,設(shè)計(jì)了軟件定位方法,以期達(dá)到提高維修效率、減少維修成本的效果。
龍芯3號(hào)對(duì)外接口采用擴(kuò)展的HT協(xié)議,既可用于連接IO又可實(shí)現(xiàn)多芯片互聯(lián)。HT是系統(tǒng)級(jí)的總線,IO多指南北橋芯片,多芯片互聯(lián)是指與多個(gè)龍芯3號(hào)互聯(lián),即在同一塊主板上構(gòu)建2路或4路CC-NUMA系統(tǒng)。一旦HT總線互聯(lián)出現(xiàn)故障,將導(dǎo)致系統(tǒng)無(wú)法啟動(dòng)。
為了簡(jiǎn)化描述,本文以龍芯3號(hào)處理器連接橋片為研究對(duì)象,提出一種HT鏈路故障的診斷及自修復(fù)方法。對(duì)于多處理器HT互聯(lián)的情況,處理方法類(lèi)似。
在大量的板卡維修過(guò)程中,我們發(fā)現(xiàn)有些機(jī)器在500次重啟實(shí)驗(yàn)過(guò)程中總有幾次啟動(dòng)死機(jī)的情況,通過(guò)調(diào)試串口及Ejtag進(jìn)一步定位發(fā)現(xiàn)死機(jī)時(shí)機(jī)器卡在HT總線建鏈互聯(lián)處,這種故障的典型現(xiàn)象是:調(diào)試串口輸出“Waiting HyperTransport bus to be up.”或“Waiting HyperTransport bus to be up again.”的字樣,隨后機(jī)器死機(jī),再也沒(méi)有輸出。
龍芯3號(hào)與橋片的HT總線的建鏈過(guò)程是:復(fù)位時(shí)序按照硬件配置的總線頻率和總線位寬發(fā)起建鏈請(qǐng)求,軟件查詢建鏈完成位[10];建鏈成功后軟件對(duì)橋片端進(jìn)行接收窗口的配置;軟件重新設(shè)置CPU和橋片兩端的總線頻率和總線位寬使其工作在最高的頻率和最寬的位寬;復(fù)位HT總線等待重新建鏈;查詢建鏈完成位;建鏈完成后把總線再次配置成剛上電的狀態(tài)方便下次重啟建鏈;以當(dāng)前設(shè)置的總線頻率和總線位寬進(jìn)行IO讀寫(xiě)通信。
調(diào)研發(fā)現(xiàn),傳統(tǒng)的龍芯3號(hào)主板軟硬件對(duì)HT總線的建鏈?zhǔn)в袃煞N處理機(jī)制:一是使用硬件看門(mén)狗在此處監(jiān)控建鏈過(guò)程是否失敗,若失敗則看門(mén)狗因超時(shí)會(huì)發(fā)出復(fù)位信號(hào)重啟系統(tǒng),一般情況下,多次重啟都能解決HT握手的問(wèn)題;二是放任不管,畢竟此故障是小概率事件,對(duì)于可靠性要求不高的場(chǎng)合,手動(dòng)重啟就可以解決問(wèn)題。但對(duì)于安全應(yīng)用領(lǐng)域,通常會(huì)面臨無(wú)人值守,長(zhǎng)期加電的應(yīng)用場(chǎng)景,一次啟動(dòng)失敗會(huì)造成災(zāi)難性的后果。另一方面,基于成本和PCB布局面積的考慮,不是所有的板卡在設(shè)計(jì)時(shí)都預(yù)留硬件看門(mén)狗電路,最好的解決辦法是在不要求硬件的前提下通過(guò)CPU內(nèi)部機(jī)制實(shí)現(xiàn)監(jiān)控“HT總線的建鏈?zhǔn)А钡那闆r,并進(jìn)行重啟自我修復(fù)。
我們把BIOS階段負(fù)責(zé)啟動(dòng)和初始化任務(wù)的處理器核稱作主核(core0),其它核稱為輔核或從核。本文利用龍芯3號(hào)的多核特性,使用從核(core1)對(duì)建鏈過(guò)程進(jìn)行監(jiān)控,若發(fā)現(xiàn)建鏈過(guò)程異常,則從核(core1)發(fā)揮看門(mén)狗的作用對(duì)系統(tǒng)進(jìn)行復(fù)位,并記錄當(dāng)前復(fù)位次數(shù)至NVRAM中記為Fault,作為后期判斷主板健康狀態(tài)的依據(jù),當(dāng)重啟次數(shù)超過(guò)重啟門(mén)限時(shí),BIOS驅(qū)動(dòng)蜂鳴器報(bào)警,提示主板故障,硬件工程師進(jìn)行檢修。
具體的設(shè)計(jì)流程如下:
系統(tǒng)冷啟動(dòng),F(xiàn)ault初始化為0;
當(dāng)系統(tǒng)是熱啟動(dòng)且從核沒(méi)有收到主核發(fā)出的HTok通知時(shí),會(huì)根據(jù)Fault的值產(chǎn)生如下行為:
Fault++<=3, 簡(jiǎn)單地復(fù)位重啟;
Fault++ =4, 把HT總線位寬由16位設(shè)計(jì)成8位互聯(lián)模式,重啟互聯(lián);
Fault++ =5, 把HT總線頻率由1600 MHz降到800 MHz,重啟互聯(lián);
Fault++ =6, 把HT總線頻率由800 MHz降到400 MHz,重啟互聯(lián);
Fault++ =7, 把HT總線頻率由400 MHz降到200 MHz,重啟互聯(lián);
Fault++ =8, CORE1驅(qū)動(dòng)蜂鳴器報(bào)警。
這種設(shè)計(jì)方法能解決絕大多數(shù)的HT總線偶發(fā)互聯(lián)不上的問(wèn)題,并且可以根據(jù)Fault的值或啟動(dòng)打印信息獲取當(dāng)前的HT總線配置信息,并對(duì)硬件故障進(jìn)行報(bào)警指示,達(dá)到比較高的可靠性要求。
從圖2可以看到,計(jì)算機(jī)模塊啟動(dòng)過(guò)程中固件最初在FLASH芯片中運(yùn)行,為了加塊固件初始化速度,BIOS中增加鎖CACHE操作,通過(guò)Cache As Ram(CAR)技術(shù)將高速緩存作為臨時(shí)內(nèi)存使用。在鎖CACHE期間完成了內(nèi)存的初始化與內(nèi)存訓(xùn)練,內(nèi)存故障檢測(cè)等功能。
CAR技術(shù)是把CPU的Cache作為RAM使用。龍芯3號(hào)CPU均支持鎖Cache機(jī)制,落在被鎖區(qū)域中的共享Cache塊會(huì)被鎖住,讀寫(xiě)操作到cache后不會(huì)向內(nèi)存?zhèn)鬟f,因而不會(huì)被替換出共享Cache。此外當(dāng)共享 Cache收到 Direct Memeory Access(DMA) 寫(xiě)請(qǐng)求時(shí),如果被寫(xiě)的區(qū)域在共享 Cache 中命中且被鎖住,那么 DMA 寫(xiě)將直接寫(xiě)入到共享 Cache而不是內(nèi)存。
龍芯3A處理器提供了4組共享Cache鎖窗口寄存器,通過(guò)窗口鎖地址寄存器指定鎖存地址,鎖窗口掩碼寄存器指定鎖窗口地址的大小。
鎖Cache完成后,程序?qū)⒃贑ache中完成內(nèi)存的初始化及內(nèi)存故障檢測(cè)功能。
龍芯3A處理器的內(nèi)存的組織形式,以雙路為例如圖4所示。
圖4 龍芯3A雙路計(jì)算機(jī)模塊內(nèi)存(x8位寬)邏輯連接圖
在龍芯3A CPU中包含2個(gè)內(nèi)存控制器(MC0、MC1),每個(gè)內(nèi)存控制器最多支持兩個(gè)PBANK,通過(guò)片選信號(hào)cs進(jìn)行控制,每個(gè)PBANK可支持的數(shù)據(jù)位寬為64 bit。若我們使用X8位寬的內(nèi)存顆粒,每個(gè)內(nèi)存控制器都接滿內(nèi)存,那么一個(gè)龍芯3號(hào) CPU 將外接32顆內(nèi)存顆粒。如果龍芯3號(hào)使用多芯片互聯(lián)模式,如雙路系統(tǒng),那么板載將最多接64顆x8的內(nèi)存顆粒。
對(duì)于多路互聯(lián)計(jì)算機(jī)模塊,內(nèi)存顆粒故障診斷流程如圖5所示。
圖5 龍芯3號(hào)板卡多路互聯(lián)內(nèi)存排查流程
圖5內(nèi)存故障診斷可以歸納為以下3點(diǎn):
1)當(dāng)內(nèi)存出現(xiàn)讀寫(xiě)錯(cuò)誤時(shí),首先確定是哪個(gè)CPU上的內(nèi)存有問(wèn)題;
對(duì)于CPU多路互聯(lián)情況,BIOS通過(guò)診斷程序參數(shù)選擇單路模式啟動(dòng),若內(nèi)存測(cè)試通過(guò),說(shuō)明CPU0的內(nèi)存沒(méi)問(wèn)題;再設(shè)置成雙路模式啟動(dòng),做內(nèi)存測(cè)試有問(wèn)題說(shuō)明是CPU1上的內(nèi)存出錯(cuò)。對(duì)于四路服務(wù)器依此類(lèi)推,找出內(nèi)存顆粒所在的處理器編號(hào)。
2)當(dāng)鎖定處理器編號(hào)后,確定是此處理器的哪個(gè)內(nèi)存控制器(MC0還是MC1)的內(nèi)存問(wèn)題;
一個(gè)CPU上的兩個(gè)內(nèi)存控制器分別進(jìn)行初始化,內(nèi)存初始化時(shí),BIOS通過(guò)診斷程序參數(shù)選擇初始化成單通道MC0,然后進(jìn)行內(nèi)存初始化,內(nèi)存測(cè)試,若內(nèi)存測(cè)試錯(cuò)誤,則內(nèi)存顆粒在MC0控制器所接內(nèi)存上。否則在MC1上。
3)最后確定是上述內(nèi)存控制器中哪個(gè)片選上內(nèi)存顆粒有問(wèn)題;
通過(guò)片選信號(hào),只選擇MC上的一個(gè)CS的內(nèi)存進(jìn)行初始化,并根據(jù)內(nèi)存讀寫(xiě)測(cè)試程序的測(cè)試結(jié)果,確定出錯(cuò)的內(nèi)存所在的組,進(jìn)而定位故障顆粒。
圖5中內(nèi)存讀寫(xiě)測(cè)試環(huán)節(jié)是內(nèi)存診斷程序的核心,內(nèi)存診斷程序?qū)?nèi)存地址空間進(jìn)行反復(fù)讀寫(xiě)訪問(wèn),來(lái)判斷內(nèi)存是否有訪問(wèn)錯(cuò)誤情況。如果讀寫(xiě)信息不一致,程序?qū)?huì)打印出該內(nèi)存的地址信息,寫(xiě)入和讀出的數(shù)據(jù)信息。
內(nèi)存診斷程序流程如圖6所示。
圖6 內(nèi)存診斷程序流程
內(nèi)存診斷程序的思想:對(duì)指定內(nèi)存地址空間,通過(guò)UnCached地址先寫(xiě)值后讀值,比較讀出來(lái)的內(nèi)容是否與寫(xiě)入值一致。
內(nèi)存診斷程序劃分為2個(gè)階段:簡(jiǎn)單內(nèi)存讀寫(xiě)測(cè)試和復(fù)雜內(nèi)存讀寫(xiě)測(cè)試。簡(jiǎn)單內(nèi)存讀寫(xiě)測(cè)試主要對(duì)內(nèi)存物理地址0x0-0x38進(jìn)行簡(jiǎn)單的讀寫(xiě)測(cè)試,用于判斷讀寫(xiě)時(shí)序的正確性,其測(cè)試case為依次對(duì)上述地址以8次節(jié)為長(zhǎng)度為單位寫(xiě)入0x5555555555555555、0xaaaaaaaaaaaaaaa、0x3333333333333333、0xcccccccccccccccc、0x7777777777777777、0x8888888888888888、0x1111111111111111、0xeeeeeeeeeeeeeeee,并讀出內(nèi)容與寫(xiě)入內(nèi)容進(jìn)行比較,若一致剛通過(guò),若不一致則優(yōu)先解決時(shí)序問(wèn)題。
復(fù)雜的內(nèi)存測(cè)試,是對(duì)指定內(nèi)存地址范圍進(jìn)行讀寫(xiě)測(cè)試,讀寫(xiě)的數(shù)據(jù)的case分為:
Case1:寫(xiě)全1;
Case2:寫(xiě)全0;
Case3:逐位寫(xiě)1,其余位為0;
Case4:逐位寫(xiě)0,其余位為1;
Case5:對(duì)所有奇數(shù)位寫(xiě)1,偶數(shù)位寫(xiě)0;
Case6: 對(duì)所有偶數(shù)位寫(xiě)0,奇數(shù)位寫(xiě)1;
Case7: 依次每個(gè)字節(jié)寫(xiě)入0x11、0x33、0x77
Case8: 依次每個(gè)字節(jié)寫(xiě)入0xee、0xcc、0x88
Case9: BASE + DATA*n;
其中 DATA,BASE均是一個(gè)固定數(shù),例如,DATA=0x200,BASE = 0x9800000090100000; 起始地址寫(xiě)入的測(cè)試數(shù)據(jù)初值為0x9800000090100000,隨著地址每增加8個(gè)字節(jié),固定寫(xiě)入的測(cè)試數(shù)據(jù)值就增加DATA。
BIOS啟動(dòng)進(jìn)入內(nèi)存診斷程序,首先進(jìn)入內(nèi)存簡(jiǎn)單測(cè)試,測(cè)試場(chǎng)景包括case0,1,2,3。下面是簡(jiǎn)單測(cè)試讀寫(xiě)均正確時(shí)的結(jié)果:
The uncache data is:
00000000: 5555555555555555
00000008: aaaaaaaaaaaaaaaa
00000010: 3333333333333333
00000018: cccccccccccccccc
00000020: 7777777777777777
00000028: 8888888888888888
00000030: 1111111111111111
00000038: eeeeeeeeeeeeeeee
The cache data is:
00000000: 5555555555555555
00000008: aaaaaaaaaaaaaaaa
00000010: 3333333333333333
00000018: cccccccccccccccc
00000020: 7777777777777777
00000028: 8888888888888888
00000030: 1111111111111111
00000038: eeeeeeeeeeeeeeee
內(nèi)存簡(jiǎn)單測(cè)試包含了過(guò)cache的內(nèi)存讀寫(xiě)和不過(guò)cache的內(nèi)存讀寫(xiě),每部分均只測(cè)試了0x38個(gè)字節(jié)范圍,主要目的完成內(nèi)存讀寫(xiě)時(shí)序的簡(jiǎn)單調(diào)試與判斷,以及內(nèi)存數(shù)據(jù)線通路是否有問(wèn)題的判斷。
內(nèi)存復(fù)雜測(cè)試在簡(jiǎn)單測(cè)試的基礎(chǔ)上增加了更多、更復(fù)雜的內(nèi)存讀寫(xiě)場(chǎng)景,內(nèi)存地址空間范圍更大。復(fù)雜測(cè)試程序設(shè)計(jì)了交互界面,可以指定內(nèi)存的測(cè)試地址范圍。
內(nèi)存復(fù)雜測(cè)試人機(jī)交互界面以及采用多種case時(shí),案例出錯(cuò)的測(cè)試結(jié)果:
Do mem test?(Input 0xf skip ):16'h //是否進(jìn)入內(nèi)存復(fù)雜測(cè)試界面
Default test param S1 = 0x0010000080000000
Change test param S1? (Input 0xf skip):16'h //是否修改內(nèi)存測(cè)試指定地址范圍
Start Testing Memory...
Address Stuck Testing all space...
Test address range: 0x9800000090100000~0x9800000110000000
write done...
Stuck Testing done!
Pattern WalkOnes Test...
Test address range: 0x9800000090100000~0x9800000110000000 @@ address interval: 0x00000040
write done. begin to read and compare…
...
addr 0x98000000908bb0a0 expected: 1010101010101010 read: 101010ff10101010 reread: 1010101010101010 DDD
addr 0x98000000908bb0c0 expected: 0101010101010101 read: 0101010401010101 reread: 0101010101010101 DDD
addr 0x9800000090c9c180 expected: 0101010101010101 read: 0101014001010101 reread: 0101014001010101
addr 0x9800000090c9c188 expected: 0202020202020202 read: 0202028002020202 reread: 0202028002020202
addr 0x9800000090c9c190 expected: 0404040404040404 read: 0404040104040404 reread: 0404040104040404
addr 0x9800000090c9c198 expected: 0808080808080808 read: 0808080208080808 reread: 0808080208080808
addr 0x9800000090c9c1a0 expected: 1010101010101010 read: 1010100410101010 reread: 1010100410101010
針對(duì)HT互聯(lián)故障的檢測(cè)和恢復(fù)方法,我們選用5塊龍芯1500+龍芯7A的板卡進(jìn)行了每塊主板500次重啟的驗(yàn)證實(shí)驗(yàn),對(duì)采用本文中的方法的前后實(shí)驗(yàn)情況做了對(duì)比分析。
表1中第二列表示在未采用本措施時(shí),主板在做500次的重啟實(shí)驗(yàn)過(guò)程中進(jìn)行了第幾次后無(wú)法完成重啟實(shí)驗(yàn),可以觀察到主板編號(hào)為201703001S、201703007S的兩塊板卡成功完成了500次的重啟實(shí)驗(yàn),編號(hào)為:201703003S、201703011S、201703014S的主板分別在進(jìn)行了127、308、
表1 HT互聯(lián)故障檢測(cè)方法比較
432次重啟后出現(xiàn)了系統(tǒng)死機(jī),表現(xiàn)為HT互聯(lián)故障。表中第三列表示采用了本方法后,5塊主板都可以完成500次的重啟實(shí)驗(yàn),并且通過(guò)獲取NVRAM的Fault值(表中第四列)可以判斷編號(hào)為201703003S的主板重啟過(guò)2次,編號(hào)為201703011S的主板重啟過(guò)1次,這個(gè)數(shù)據(jù)也可以作為預(yù)警信息提示這兩塊板卡的健康狀態(tài)存在問(wèn)題,主板維護(hù)人員需盡早檢修,排除故障隱患。
這種方式比傳統(tǒng)的重新修改HT的配置,并重新編譯燒錄固件完成故障診斷的方式節(jié)約了大量的時(shí)間成本。
內(nèi)存故障檢測(cè)程序考慮時(shí)效性和覆蓋性,本文中的復(fù)雜內(nèi)存測(cè)試并不是全地址覆蓋測(cè)試,而是在選擇合理的地址間隔進(jìn)行測(cè)試。這種測(cè)試方法可以大幅度提高內(nèi)存故障檢測(cè)速度。
內(nèi)存顆粒的物理設(shè)計(jì),要求行地址線+列地址線+BANK線組合成一個(gè)物理地址后才能唯一尋址一個(gè)內(nèi)存存儲(chǔ)單元(通常由8位或16位組成)。內(nèi)存故障,通常表現(xiàn)為某個(gè)行/列選通的地址讀寫(xiě)都有問(wèn)題。內(nèi)存行地址線個(gè)數(shù)一般12個(gè)以上,列地址線個(gè)數(shù)為10。因此地址選通最小覆蓋地址線的地址間隔為2^10,及1 KB。因此內(nèi)存故障檢測(cè)時(shí),我們以1K的地址范圍為步長(zhǎng)進(jìn)行間隔讀寫(xiě)操作。這種檢測(cè)方法比全地址覆蓋的測(cè)試方法速率快1 024倍。
BIOS實(shí)際內(nèi)存測(cè)試程序測(cè)試結(jié)果如下:
Start Testing Memory...
Address Stuck Testing all space...
Test address range: 0x9800000080100000~0x9800000088000000
write done...
addr 0x9800000080103600 expected: 9800000080103600 read: 9800000080103604 reread: 9800000080103604
addr 0x9800000080103800 expected: 9800000080103800 read: 9800000080103804 reread: 9800000080103804
addr 0x9800000080103a00 expected: 9800000080103a00 read: 9800000080103a04 reread: 9800000080103a04
…
內(nèi)存測(cè)試結(jié)果解析:內(nèi)存讀寫(xiě)測(cè)試中期望值與讀的值不一致,證明內(nèi)存確有出錯(cuò),根據(jù)數(shù)據(jù)位錯(cuò)誤信息,內(nèi)存讀寫(xiě)錯(cuò)誤固定出現(xiàn)數(shù)據(jù)位bit2上,也即內(nèi)存的數(shù)據(jù)線DQ2
對(duì)應(yīng)的內(nèi)存顆粒故障。結(jié)合上述內(nèi)存顆粒故障診斷方法以及板卡原理圖,我們就能唯一確定內(nèi)存故障顆粒位置。
這種內(nèi)存故障定位方法,對(duì)于內(nèi)存模塊由于對(duì)應(yīng)的數(shù)據(jù)線虛焊、PCB布線問(wèn)題、內(nèi)存數(shù)據(jù)線對(duì)應(yīng)匹配電阻問(wèn)題及內(nèi)存顆粒本身故障等都能準(zhǔn)確地定位,然后再由硬件工程師進(jìn)行定點(diǎn)排查,最終決定是否更換內(nèi)存顆粒。
通過(guò)BIOS中的故障診斷手段,我們實(shí)現(xiàn)了龍芯3號(hào)計(jì)算機(jī)板卡HT鏈路無(wú)法鏈接,內(nèi)存錯(cuò)誤導(dǎo)致程序出錯(cuò)等問(wèn)題的快速定位。軟件定位故障方法簡(jiǎn)化了硬件工程師在硬件問(wèn)題上的排查的工作量,完成了故障診斷的輕便化和智能化操作實(shí)現(xiàn)。隨著硬件智能化程度的提升,復(fù)雜主板板級(jí)故障診斷將向著故障預(yù)測(cè)及自修復(fù)方向發(fā)展,進(jìn)一步提升系統(tǒng)可用性,為裝備智能化發(fā)展奠定基礎(chǔ)。