為了滿足用戶對于系統安全性保障的要求,英創公司推出了針對Linux主板的系統還原方案,該方案依靠一個外部存儲器件,可以使用U盤或者TF卡。用戶只需要將英創公司提供的內核、文件系統鏡像文件和用戶程序拷貝到U盤或者TF卡中就可以了,U盤和TF卡需要是fat32文件系統格式。用戶可以通過英創公司提供的庫文件,在應用程序中設置u-boot的參數來實現還原的方案,下面首先詳細介紹整個流程:
bootloader階段
主板啟動后,作為Bootloader的u-boot會打開看門狗,并檢查環境變量bootstate的值,默認情況bootstate的值為0,說明系統還原的功能沒有啟用。將bootstate的值設置為1就可以啟用該功能。
同時用戶可以設置允許的最大嘗試啟動次數bootnum,如果bootstate的值小于等于bootnum那么u-boot會將bootstate的值加1后進行正常啟動,如果bootstate的值大于bootnum,說明連續啟動(bootnum-1)次失敗,u-boot開始進入還原的流程。通過對于bootnum的設置,可以防止板卡對于系統還原的誤判,比如在啟動中突發的異常斷電等情況造沒有正常啟動完成,流程可參考下圖:
u-boot流程
還原的固件可以通過U盤或者TF卡存放,u-boot中通過環境變量system-recovery來判斷從哪一種設備中讀取固件,system-recovery等于system-recovery-usb則u-boot會通過U盤進行還原,如果system-recovery等于system-recovery-sd則u-boot會通過TF卡進行還原,用戶可以根據實際情況配置。
Kernel階段
進入到kernel啟動之后,系統的運行模式下會重新初始化并使能看門狗,如果系統啟動正常,板卡在啟動完成后,英創公司提供的程序boot_recovery會自行啟動,檢測u-boot中bootstate的值,如果大于bootnum,說明系統經過了還原,初始化程序會將U盤或者TF卡中存放的用戶的應用程序和文件拷貝到/mnt/nandflash目錄,然后將bootstate的值置為1(注意,需要拷貝的程序和文件必須放在U盤或者TF卡的update文件夾下)。如果檢測到bootstate的值小于bootnum,那么說明板卡正常啟動,將bootstate的值置為1后退出程序,執行正常啟動過程。考慮到啟動過程中可能會遇到斷電或者供電不穩等特殊情況,造成板卡啟動失敗,可以將bootnum的值適當增大。最后系統會根據用戶配置自動啟動應用程序,這時需要用戶的應用程序第一時間接管看門狗并開始喂狗,否則等到看門狗超時系統還是會重新啟動。
如果遇到系統啟動不正常的情況,不會執行到程序boot_recovery,所以bootstate的值不會改變,等待看門狗超時(60s)后,系統便會重啟,反復嘗試次(bootnum-1)次后,進入到還原流程,整個過程可參考下圖:
Kernel流程
還原流程
當u-boot檢測到bootstate的值大于等于bootnum,就會進入到還原流程。這時u-boot將根據配置讀取U盤或者TF卡中的內核和文件系統鏡像文件,擦除NandFlash對應的位置重新燒寫進去,燒寫完成后啟動系統,為了防止燒寫過程中出現意外情況,所以并沒有修改bootstate的值,而是等到系統完全啟動后執行程序boot_recovery中再來修改bootstate的值。
在板卡中英創公司通過專門的庫librecovery.so,給用戶提供了對系統還原參數的查詢和設置接口,這樣就能夠自定義系統還原后的操作。ibrecovery.so中提供的接口函數為:
int recovery_config(int cmd, char *s);
可以根據cmd的值來執行不同的操作,具體定義如下:
#define GET_BOOT_STATE 0 //查詢bootstate的值 #define SET_BOOT_STATE 1 //設置bootstate的值 #define SET_BOOT_MAXNUM 2 //設置最大啟動次數 #define GET_BOOT_MAXNUM 3 //查詢最大啟動次數 #define SET_WAY_RECOVERY 4 //設置系統還原方式 #define GET_WAY_RECOVERY 5 //查詢系統還原方式 |
下面通過boot_recovery中的部分代碼來說明函數接口的使用,首先是查詢bootstate的值,判斷板卡是否使能系統還原,如果沒有使能就退出:
recovery_config(GET_BOOT_STATE, buf); if(!strlen(buf)) return 0; i1 = atoi(buf); printf("%d\n", i1); if(!i1) return 0; |
如果使能就判斷是正常啟動還是進行了系統還原,如果進行了系統還原,就根據系統還原的方式,將U盤或者TF卡中update文件夾的內容拷貝到/mnt/nandflash中,并且把bootstate的值設置為1:
recovery_config(GET_BOOT_MAXNUM, buf); if(i1 > (atoi(buf) + 1)) { recovery_config(GET_WAY_RECOVERY, buf); s = strstr(buf, "usb"); if(s != NULL) system("cp /mnt/usb1/update/* /mnt/nandflash/ -r"); s = strstr(buf, "sd"); if(s != NULL) system("cp /mnt/sdcard/update/* /mnt/nandflash/ -r"); } sprintf(buf, "%d", 1); recovery_config(SET_BOOT_STATE, buf); |
如果用戶有一些需要自行設置的參數,可以在應用程序中進行設置,比如最大的嘗試啟動次數和系統還原的方式,都可以在應用程序的開始設置一遍。
如果對此方案感興趣的客戶,可以直接和英創的工程師連續,索取相關文件和程序。
-
Linux
+關注
關注
87文章
11295瀏覽量
209348 -
嵌入式主板
+關注
關注
7文章
6085瀏覽量
35297
發布評論請先 登錄
相關推薦
評論