本發(fā)明涉及一種嵌入式系統(tǒng)的啟動方法,具體涉及一種基于Flash啟動過程中主備保護的方法,能夠在Flash主區(qū)損壞的情況下自動切換到備區(qū)啟動,保證系統(tǒng)的穩(wěn)定性,本發(fā)明適用于通信和計算機領(lǐng)域。
背景技術(shù):
在嵌入式開發(fā)中,系統(tǒng)的固件程序通常是存放在非易失存儲器上,常見的存儲器有NAND Flash,Nor Flash和QSPI Flash,F(xiàn)lash的基本特點就是作為塊存儲設(shè)備,可以快速的讀寫一大塊數(shù)據(jù),這個特點使其適合作為系統(tǒng)的固件存放設(shè)備。它可以做到快速的更新系統(tǒng)(寫固件到Flash),減少系統(tǒng)的在線升級時間;同時可以做到快速上電啟動(讀出Flash中固件內(nèi)容),提高上電啟動速度,減小系統(tǒng)冷啟動或者復(fù)位啟動時間,從而減少了系統(tǒng)業(yè)務(wù)中斷的時間。NAND、Nor和QSPI Flash,它們的工藝,容量大小各有特點,會應(yīng)用在不同的場合,其中QSPI Flash訪問速度快,Nor Flash可靠性高,但是容量小,成本高,NAND Flash則容量大,成本適中。
但是無論是哪種Flash,都面臨著同一個問題,就是系統(tǒng)的高可靠性。在系統(tǒng)進行升級固件的時候,需要先擦除Flash中存放的數(shù)據(jù),再寫入待升級的固件內(nèi)容。在這個過程中,如果掉電或者寫Flash失敗了,則系統(tǒng)會由于Flash中固件內(nèi)容損壞,而不能正常啟動,中斷一切運行的業(yè)務(wù)(比如光控制或者任何功能控制),嚴重影響了系統(tǒng)的可靠性。
上述過程,雖然掉電或者寫Flash失敗現(xiàn)象的概率不高,但是一旦出現(xiàn),則系統(tǒng)就不能正常運行,這對通信系統(tǒng)而言是致命錯誤。
現(xiàn)有技術(shù)中急需一種能夠在Flash啟動過程中提供主備保護的方法,來提高系統(tǒng)的可靠性,減少系統(tǒng)因為Flash數(shù)據(jù)錯誤而導(dǎo)致系統(tǒng)啟動失敗的現(xiàn)象,提高了系統(tǒng)的穩(wěn)定性和可靠性。
技術(shù)實現(xiàn)要素:
本發(fā)明克服現(xiàn)有技術(shù)存在的缺陷,提出了一種Flash啟動過程中主備保護的方法,用于解決現(xiàn)有技術(shù)中系統(tǒng)不可靠的問題,提高了系統(tǒng)穩(wěn)定性。
本發(fā)明的技術(shù)方案是:
一種基于Flash啟動過程中主備保護的方法,所述嵌入式系統(tǒng)的加載程序Bootloader中執(zhí)行基于Flash啟動過程中主備保護的步驟,所述步驟包括:在Flash芯片里設(shè)置存儲固件程序和/或數(shù)據(jù)的系統(tǒng)主分區(qū)、備分區(qū),以及設(shè)置與所述固件程序和/或數(shù)據(jù)的校驗值相對應(yīng)的系統(tǒng)固件的原始校驗值;
Bootloader讀出系統(tǒng)主分區(qū)的數(shù)據(jù),由校驗值算法計算出系統(tǒng)主分區(qū)中存儲的固件程序和/或數(shù)據(jù)的校驗值;
Bootloader比較從Flash芯片中讀取的系統(tǒng)固件的原始校驗值和由校驗值算法計算出系統(tǒng)主分區(qū)中存儲的固件程序和/或數(shù)據(jù)的校驗值,當兩者的校驗值一致時,Bootloader選擇加載系統(tǒng)主分區(qū)中存儲的固件程序和/或數(shù)據(jù),從系統(tǒng)主分區(qū)啟動;當兩者的校驗值不一致,Bootloader選擇從系統(tǒng)備分區(qū)啟動。
所述Flash芯片設(shè)置有四個分區(qū),分區(qū)1存放Bootloader可執(zhí)行文件,分區(qū)2做為系統(tǒng)主分區(qū)存放系統(tǒng)的固件程序,分區(qū)3做為系統(tǒng)備分區(qū)存放系統(tǒng)的固件程序,分區(qū)4存放所述系統(tǒng)的固件程序的原始校驗值。
所述原始校驗值是在生成系統(tǒng)的固件程序時,通過校驗值算法計算獲得并保存。
所述Bootloader從所選擇的系統(tǒng)主分區(qū)或系統(tǒng)備分區(qū)加載固件程序來啟動操作系統(tǒng),完成系統(tǒng)啟動。
所述操作系統(tǒng)為Linux系統(tǒng)。
校驗值為CRC32校驗值。
本發(fā)明具備的優(yōu)點是:
采用本發(fā)明方法,如果系統(tǒng)的Flash因為升級過程掉電,或者升級寫Flash失敗,或者其他外部方法比如仿真器擦除了Flash主區(qū)內(nèi)容等原因,導(dǎo)致了Flash主區(qū)數(shù)據(jù)損壞,系統(tǒng)可以通過CRC32校驗,自動的檢測到Flash主區(qū)的數(shù)據(jù)被修改或者不完整,從而選擇從備份區(qū)啟動,不會出現(xiàn)系統(tǒng)因為固件損壞而掛死現(xiàn)象。本方法提供了自動檢測判斷Flash主區(qū)數(shù)據(jù)是否損壞,并自動切換到備分區(qū)啟動流程,提高通信系統(tǒng)的可靠性。
附圖說明
圖1是NAND Flash分區(qū)示意圖;
圖2是系統(tǒng)啟動概述流程圖;
圖3是系統(tǒng)啟動詳細流程圖;
具體實施方式
為了便于本領(lǐng)域普通技術(shù)人員理解和實施本發(fā)明,下面結(jié)合附圖及具體實施方式對本發(fā)明作進一步的詳細描述。
本發(fā)明提出了一種Flash啟動過程中提供主備保護的方法,主要在開機Bootloader程序中增加如下功能:對Flash主分區(qū)數(shù)據(jù)完整性CRC32校驗,根據(jù)CRC32校驗的結(jié)果來選擇從主區(qū)或者備區(qū)啟動。
步驟1.1:對NAND Flash的使用進行規(guī)劃分區(qū),請參閱圖1,將NAND Flash按照功能劃分為4個區(qū)域,其中,分區(qū)1存放Bootloader可執(zhí)行文件,大小為1MB,對應(yīng)著Flash首地址0x0地址;分區(qū)2存放系統(tǒng)的固件程序,作為系統(tǒng)啟動的首選分區(qū)(主分區(qū));分區(qū)3存放系統(tǒng)的備份固件程序(此處的備份固件程序和主分區(qū)的固件程序是一致的);作為系統(tǒng)啟動的備選分區(qū)(備分區(qū));分區(qū)4存放固件的原始CRC32值。上述四個分區(qū)除了分區(qū)1必須存放于Flash首地址以外,其他分區(qū)可以根據(jù)需要任意布置,優(yōu)選按照分區(qū)1、分區(qū)2、分區(qū)4、分區(qū)3的順序依次布置。
步驟1.1.1:計算固件程序原始數(shù)據(jù)的CRC32。為了保證數(shù)據(jù)的正確,就不得不采用檢錯的手段。在諸多檢錯手段中,CRC是最著名的一種,CRC的全稱是循環(huán)冗余校驗。CRC32指的是用32位數(shù)據(jù)來表示CRC的值。標準的CRC算法的生成多項式:
通過CRC32公式,將原始固件程序作為輸入,對固件程序每一個字節(jié)內(nèi)容計算,最終得出一個32bit的無符號整數(shù)值,它用來作為判斷固件的內(nèi)容是否被修改的標準。啟動時候,只需比較Flash主分區(qū)計算得出的CRC32和分區(qū)4中存放的原始的CRC32值是否一致即可完成判斷。
步驟1.2:上電或者復(fù)位,系統(tǒng)從分區(qū)1啟動,Bootloader開始執(zhí)行,Bootloader首選判斷Flash主分區(qū)(分區(qū)2)數(shù)據(jù)是否完備,如果主分區(qū)數(shù)據(jù)校驗通過,加載主分區(qū)中的固件程序到內(nèi)存執(zhí)行;如果主分區(qū)數(shù)據(jù)校驗失敗,則判斷備分區(qū)(分區(qū)3)數(shù)據(jù)是否完備,如果備分區(qū)數(shù)據(jù)校驗通過,選擇從備分區(qū)加載固件程序,如圖2所示。
步驟1.2.1:Bootloader讀出Flash主分區(qū)A(分區(qū)2)的數(shù)據(jù),并根據(jù)CRC32運算的公式,計算出CRC32值,如圖3步驟101所示。
步驟1.2.2:Bootloader讀出固件CRC分區(qū)(分區(qū)4)中固件的原始CRC32值,這個值是在生成固件程序的時候,通過CRC32算法計算得出,并保存下來,與固件程序一起被寫入到Flash中,如圖3步驟102所示。
步驟1.2.3:Bootloader比較固件原始的CRC32值和根據(jù)Flash主分區(qū)(分區(qū)2)讀出的數(shù)據(jù)計算得出的CRC32值,如圖3步驟103所示。
步驟1.2.4:如果兩者的CRC32值一致,則說明主分區(qū)數(shù)據(jù)正常,Bootloader選擇加載主分區(qū)的固件程序,從主分區(qū)啟動,如圖3步驟104所示。
步驟1.2.5:如果兩者的CRC32值不一致,則說明主分區(qū)數(shù)據(jù)不完備,Bootloader選擇跳過主分區(qū)內(nèi)容,從備分區(qū)啟動,如圖步驟105所示。注意,由于備份區(qū),軟件不會修改或者升級,所以備份區(qū)不會出現(xiàn)內(nèi)容被修改的情況,它只作為系統(tǒng)應(yīng)急備份啟動,從而保證了穩(wěn)定性。
步驟1.3:Bootloader從選擇的分區(qū)啟動操作系統(tǒng)(例如Linux),完成系統(tǒng)啟動。
雖然本發(fā)明已經(jīng)詳細地示出并描述了相關(guān)的特定的實施例參考,但本領(lǐng)域的技術(shù)人員應(yīng)該能夠理解,在不背離本發(fā)明的精神和范圍內(nèi)可以在形式上和細節(jié)上作出各種改變。這些改變都將落入本發(fā)明的權(quán)利要求所要求的保護范圍。