在工業(yè)生產(chǎn)中,固件燒寫是確保產(chǎn)品正常運(yùn)行的關(guān)鍵環(huán)節(jié)。本文通過一個(gè)實(shí)際案例,揭示了Linux系統(tǒng)下因文件寫入異步性導(dǎo)致的固件燒寫不完全問題。 ?客戶案例
客戶產(chǎn)線上批量生產(chǎn)時(shí),用SD卡進(jìn)行固件燒寫,燒寫完成后蜂鳴器提示,產(chǎn)線工人聽到蜂鳴器鳴叫后就直接斷電重啟,進(jìn)入測(cè)試環(huán)節(jié),結(jié)果在測(cè)試中發(fā)現(xiàn)有部分產(chǎn)品啟動(dòng)就出現(xiàn)異常??蛻粲媒鈮悍绞綗龑懴到y(tǒng)固件,解壓命令執(zhí)行完后,再運(yùn)行一個(gè)二進(jìn)制可執(zhí)行程序,然后鳴叫蜂鳴器。乍一看邏輯非常正確,沒有任何問題。可問題卻較高概率出現(xiàn),問題出在哪里呢?后來經(jīng)過反復(fù)排查,發(fā)現(xiàn)客戶解壓腳本里的可執(zhí)行程序里面還有二次解壓操作,而且用system()調(diào)用了Linux的Shell命令。System()調(diào)用Shell命令會(huì)生成一個(gè)新的子進(jìn)程,這樣蜂鳴器鳴叫和二次解壓分別在不同進(jìn)程中,兩者沒有同步,解壓完成和蜂鳴器鳴叫沒有必然的先后順序。按照蜂鳴器鳴叫就斷電重啟,這樣就不可避免的出現(xiàn)了解壓尚未完成就被斷電的情況,從而引起文件燒寫不完全,系統(tǒng)啟動(dòng)異常。下面圍繞該問題,對(duì)Linux文件系統(tǒng)寫文件操作進(jìn)行一些說明。 ?原理說明
由于Linux系統(tǒng)存在頁高速緩存,對(duì)寫入的內(nèi)容起到了緩存作用,用戶的寫操作實(shí)際上會(huì)被延遲。當(dāng)頁高速緩存中的數(shù)據(jù)比后臺(tái)存儲(chǔ)的數(shù)據(jù)新的時(shí)候,這些數(shù)據(jù)就被稱作臟數(shù)據(jù)。發(fā)生以下三種情況時(shí),臟頁才會(huì)被寫回磁盤:
- 當(dāng)空閑內(nèi)存低于一個(gè)特定的閾值時(shí),內(nèi)核必須將臟頁寫回磁盤以釋放內(nèi)存。
- 當(dāng)臟頁在內(nèi)存中駐留時(shí)間超過一個(gè)特定的閾值時(shí),內(nèi)核必須將超時(shí)的臟頁寫回磁盤,以確保臟頁不會(huì)無限期地駐留在內(nèi)存中。
- 當(dāng)用戶進(jìn)程調(diào)用 sync()和 fsync()系統(tǒng)調(diào)用時(shí),內(nèi)核會(huì)按照要求執(zhí)行回寫操作。
?應(yīng)對(duì)方案
如果更新腳本在解壓命令后沒有sync指令,或者程序更新代碼在執(zhí)行解壓或者寫操作后沒有調(diào)用fsync()函數(shù)執(zhí)行寫操作,Linux系統(tǒng)就會(huì)按照默認(rèn)機(jī)制來實(shí)現(xiàn)寫操作;如果沒有達(dá)到如上前2個(gè)條件,發(fā)生了斷電操作,則會(huì)導(dǎo)致寫入數(shù)據(jù)不完整。
在程序更新腳本里,解壓后必須執(zhí)行sync指令完成寫入同步,或者應(yīng)用程序代碼在寫操作后調(diào)用fsync()函數(shù)完成寫同步操作,確保數(shù)據(jù)寫入存儲(chǔ)器。
-
Linux
+關(guān)注
關(guān)注
87文章
11392瀏覽量
211795 -
文件系統(tǒng)
+關(guān)注
關(guān)注
0文章
293瀏覽量
20138 -
Shell
+關(guān)注
關(guān)注
1文章
369瀏覽量
23656
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Linux文件系統(tǒng)課程
Linux文件系統(tǒng)的異步I/O擴(kuò)展
《Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解》第5章、Linux文件系統(tǒng)與設(shè)備文件系統(tǒng)

可以了解的Linux 文件系統(tǒng)結(jié)構(gòu)

linux文件系統(tǒng)中的虛擬文件系統(tǒng)設(shè)計(jì)詳解

Linux系統(tǒng)日志文件中的JFS文件系統(tǒng)

Linux文件系統(tǒng)解析

嵌入式Linux系統(tǒng)移植-(Linux文件系統(tǒng))

Core 3328 JD4固件Linux根文件系統(tǒng)鏡像

Core 1808 JD4固件Linux根文件系統(tǒng)(Ubuntu18.04)

適用于Linux的最佳通用文件系統(tǒng) Linux文件系統(tǒng)的安裝

Linux的文件系統(tǒng)特點(diǎn)

評(píng)論