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