在工業生產中,固件燒寫是確保產品正常運行的關鍵環節。本文通過一個實際案例,揭示了Linux系統下因文件寫入異步性導致的固件燒寫不完全問題。 ?客戶案例
客戶產線上批量生產時,用SD卡進行固件燒寫,燒寫完成后蜂鳴器提示,產線工人聽到蜂鳴器鳴叫后就直接斷電重啟,進入測試環節,結果在測試中發現有部分產品啟動就出現異常。客戶用解壓方式燒寫系統固件,解壓命令執行完后,再運行一個二進制可執行程序,然后鳴叫蜂鳴器。乍一看邏輯非常正確,沒有任何問題。可問題卻較高概率出現,問題出在哪里呢?后來經過反復排查,發現客戶解壓腳本里的可執行程序里面還有二次解壓操作,而且用system()調用了Linux的Shell命令。System()調用Shell命令會生成一個新的子進程,這樣蜂鳴器鳴叫和二次解壓分別在不同進程中,兩者沒有同步,解壓完成和蜂鳴器鳴叫沒有必然的先后順序。按照蜂鳴器鳴叫就斷電重啟,這樣就不可避免的出現了解壓尚未完成就被斷電的情況,從而引起文件燒寫不完全,系統啟動異常。下面圍繞該問題,對Linux文件系統寫文件操作進行一些說明。 ?原理說明
由于Linux系統存在頁高速緩存,對寫入的內容起到了緩存作用,用戶的寫操作實際上會被延遲。當頁高速緩存中的數據比后臺存儲的數據新的時候,這些數據就被稱作臟數據。發生以下三種情況時,臟頁才會被寫回磁盤:
- 當空閑內存低于一個特定的閾值時,內核必須將臟頁寫回磁盤以釋放內存。
- 當臟頁在內存中駐留時間超過一個特定的閾值時,內核必須將超時的臟頁寫回磁盤,以確保臟頁不會無限期地駐留在內存中。
- 當用戶進程調用 sync()和 fsync()系統調用時,內核會按照要求執行回寫操作。
?應對方案
如果更新腳本在解壓命令后沒有sync指令,或者程序更新代碼在執行解壓或者寫操作后沒有調用fsync()函數執行寫操作,Linux系統就會按照默認機制來實現寫操作;如果沒有達到如上前2個條件,發生了斷電操作,則會導致寫入數據不完整。
在程序更新腳本里,解壓后必須執行sync指令完成寫入同步,或者應用程序代碼在寫操作后調用fsync()函數完成寫同步操作,確保數據寫入存儲器。
-
Linux
+關注
關注
87文章
11457瀏覽量
212761 -
文件系統
+關注
關注
0文章
293瀏覽量
20282 -
Shell
+關注
關注
1文章
372瀏覽量
23961
發布評論請先 登錄
Linux文件系統課程
Linux文件系統的異步I/O擴展
linux文件系統中的虛擬文件系統設計詳解

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

適用于Linux的最佳通用文件系統 Linux文件系統的安裝

評論