【摘要】本文以Marvell芯片芳蘭為例,介紹了Marvell芯片方案SFU產(chǎn)品FXXX中,將保存?zhèn)€性化參數(shù)的flash分區(qū)以可讀寫方式掛載為jffs2文件系統(tǒng),在其中使用一個(gè)文件來保存?zhèn)€性化參數(shù),通過操作該文件來對(duì)個(gè)性化參數(shù)進(jìn)行存取。
【關(guān)鍵詞】個(gè)性化參數(shù);存儲(chǔ)
一、概述
XPON產(chǎn)品的個(gè)性化參數(shù)主要用來對(duì)產(chǎn)品做個(gè)性化配置,可以設(shè)置CPUMAC地址、PON注冊用的sn,password等參數(shù),這些參數(shù)在產(chǎn)品出廠時(shí)進(jìn)行設(shè)置,以后直接使用,且一般不再修改,因此通常在flash中劃分一個(gè)分區(qū)來保存。單板在出廠時(shí)通過setmac命令來設(shè)置個(gè)性化參數(shù),個(gè)性化參數(shù)被寫入上述文件中,由于linux文件系統(tǒng)具有緩存功能,寫文件成功之后實(shí)際內(nèi)容不一定會(huì)及時(shí)同步到flash中,因此需要手動(dòng)同步操作。生產(chǎn)線上發(fā)現(xiàn),設(shè)置完個(gè)性化參數(shù),使用sync命令進(jìn)行同步操作,返回成功后,硬件復(fù)位,系統(tǒng)起來后個(gè)性化參數(shù)全部丟失了,這就導(dǎo)致單板啟動(dòng)之后無法正常工作。本文介紹了一種個(gè)性化參數(shù)存儲(chǔ)優(yōu)化的方式,通過這種方法,可以保證當(dāng)個(gè)性化參數(shù)設(shè)置完成返回成功時(shí),個(gè)性化參數(shù)已經(jīng)寫入到flash中。
二、芯片優(yōu)化參數(shù)
Marvell芯片方案SFU產(chǎn)品FXXX使用NANDflash,在對(duì)flash進(jìn)行分區(qū)規(guī)劃時(shí),單獨(dú)分配一個(gè)分區(qū)用來存放個(gè)性化參數(shù)。在版本啟動(dòng)之后,對(duì)個(gè)性化參數(shù)分區(qū)以可讀寫方式掛載為jffs2文件系統(tǒng)。第一次獲取個(gè)性化參數(shù)時(shí),會(huì)在個(gè)性化參數(shù)分區(qū)創(chuàng)建一個(gè)個(gè)性化參數(shù)文件。
個(gè)性化參數(shù)結(jié)構(gòu)體如下:
typedefstructTAG_PARAM_
{
unsignedshortwParamId;/個(gè)性化參數(shù)id/
unsignedshortwParamLen;/個(gè)性化參數(shù)長度/
unsignedshortwBufSize;/個(gè)性化參數(shù)數(shù)據(jù)區(qū)的長度/
unsignedcharcParamData[0];/個(gè)性化參數(shù)數(shù)據(jù)區(qū)首地址/
}TAG_PARAM_T;
個(gè)性化參數(shù)內(nèi)容緊跟在個(gè)性化參數(shù)結(jié)構(gòu)體之后,以字符串形式存取,用結(jié)構(gòu)體中的cParamData來引用。
目前需要設(shè)置的個(gè)性化參數(shù)不多,個(gè)性化參數(shù)空間定義為4K字節(jié)。對(duì)個(gè)性化參數(shù)的操作包括設(shè)置、刪除、獲取和格式化。對(duì)個(gè)性化參數(shù)文件的操作是通過系統(tǒng)調(diào)用open、read和write來實(shí)現(xiàn)。
在該產(chǎn)品產(chǎn)測過程中發(fā)現(xiàn),部分單板設(shè)置完個(gè)性化參數(shù)并且使用sync命令同步成功后,立即對(duì)單板硬件復(fù)位,當(dāng)單板重新啟動(dòng)之后,個(gè)性化參數(shù)全部丟失。通過走查代碼,我們推斷應(yīng)該是個(gè)性化參數(shù)并沒有真正寫入flash導(dǎo)致的。個(gè)性化參數(shù)是存放在文件中,當(dāng)調(diào)用write函數(shù)向文件中寫入并返回成功時(shí),并不表示內(nèi)容已經(jīng)寫入flash了,因?yàn)閘inux文件系統(tǒng)具有緩存功能,write函數(shù)只是將內(nèi)容放到緩存中,并不立即寫入到flash,操作系統(tǒng)會(huì)在適當(dāng)?shù)臅r(shí)候(定時(shí)、緩存達(dá)到一定比例、“臟”數(shù)據(jù)達(dá)到一定比例等條件下)將緩存中的內(nèi)容同步到flash中。如果在緩存內(nèi)容同步到flash之前,對(duì)單板進(jìn)行硬件復(fù)位,那么,個(gè)性化參數(shù)就可能丟失。
但是,產(chǎn)線在設(shè)置個(gè)性化參數(shù)之后,使用了sync命令進(jìn)行手動(dòng)同步,為什么還是出現(xiàn)這種情況呢?我們對(duì)sync命令的實(shí)現(xiàn)進(jìn)行分析,發(fā)現(xiàn)sync函數(shù)只是將所有修改過的塊緩沖區(qū)排入寫隊(duì)列,然后就返回,它并不等待實(shí)際寫磁盤操作結(jié)束。
三、參數(shù)優(yōu)化
為了解決這個(gè)問題,必須保證設(shè)置的個(gè)性化參數(shù)及時(shí)寫入flash。這里有方案如下。
代碼中使用fsync系統(tǒng)調(diào)用實(shí)現(xiàn)同步功能,代替命令行執(zhí)行sync命令。fsync系統(tǒng)調(diào)用強(qiáng)制內(nèi)核把文件描述符fd所指定文件的所有臟緩沖區(qū)寫到flash中。當(dāng)對(duì)個(gè)性化參數(shù)文件進(jìn)行write操作之后,調(diào)用fsync對(duì)當(dāng)前文件進(jìn)行同步,可以保證內(nèi)容肯定會(huì)被寫入flash。這樣可以保證當(dāng)調(diào)用setmac命令返回成功時(shí),個(gè)性化參數(shù)內(nèi)容已經(jīng)寫入到flash中。
四、結(jié)語
使用方案修改之后,當(dāng)使用setmac設(shè)置完個(gè)性化參數(shù),立即硬復(fù)位單板,啟動(dòng)之后檢查設(shè)置的個(gè)性化參數(shù),沒有出現(xiàn)參數(shù)丟失的現(xiàn)象,該方案可以保證設(shè)置的個(gè)性化參數(shù)立即保存到flash中。
參考文獻(xiàn)
[1]于文暢.無源光網(wǎng)絡(luò)節(jié)能等關(guān)鍵技術(shù)的研究[D].北京:北京郵電大學(xué),2011.
[2]江國舟.10Gbps以太無源光網(wǎng)絡(luò)關(guān)鍵技術(shù)與應(yīng)用研究[D].武漢:華中科技大學(xué),2009
[3]余景文.10GEPON和10GGPON標(biāo)準(zhǔn)及最新進(jìn)展[J].電信網(wǎng)技術(shù),2010(08).
作者簡介:余華(1963—),男,本科,武漢通信指揮學(xué)院,研究方向:通信技術(shù)、通信服務(wù)與業(yè)務(wù)規(guī)劃、網(wǎng)絡(luò)規(guī)劃等。