WinCE中的Flash分割槽和CheckSum點滴

2021-04-13 02:43:10 字數 4933 閱讀 6282

checksum

是一種用於檢查資料檔案有沒有發生變化的方法,對於一些重要的資料檔案為了檢查傳輸過程過程中有沒有資料的損壞或丟失,常常會用到

checksum

演算法。

wince

中經常用到

checksum

的地方就是對即將燒寫進

flash

中的image

檔案進行校驗,和燒寫完對寫入的資料進行完整性檢查,一般這裡的

image

有osimage和ut

的bin

檔案兩種。

checksum

的原理是把乙個檔案以二進位制的方式開啟,將裡面所有的位元組的值乙個乙個的累加起來,一直到最後乙個位元組,最後得到乙個累加值,它就是我們要的

checksum

的結果。從

checksum

的這個特性可知資料值為

0的位元組是不會影響到最終的結果,這種特性我認為也是

checksum

的乙個弱點,不能像

md5,

sha1

等摘要演算法一樣基本上能反映出哪怕乙個

bit的改動,但是這個特性也給

wince

執行期間計算儲存在

flash

上的image

資料檔案的完整性帶來了方便。

為了從flash

中得到正確的

checksum

值必須先了解

image

在flash

中的燒寫方式,這包括了解

image

檔案內部是怎麼組織的,

flash

的分割槽和塊的分配是如何進行的。 先以

sumsung

的flash

為例來分析一下

flash

的分割槽大體原則:

wince

的flash

分割槽大體分為

nand bootloader(nbl)

區,binfs

區和檔案區,

nbl區存放

bootloader

和燒寫image

的工具程式,

binfs

分割槽存放

mbr、

image

的xipkernel.bin

、chain.bin

和nk.bin等os

的資料。檔案區一般格式化為

fat分割槽讓

wince

上層的磁碟和分割槽管理程式管理。

flash

的分割槽是由

ut在燒入

image

的時候決定的,包括每個分割槽的起止塊位址,分割槽的大小和型別等,

detail

如下: 1)

nbl區一般佔

10個塊(

128k/

塊)的大小,分割槽雖小但是卻是最重要的部分,儲存著

ut的三大模組:

nbl1

(bootloader

),nbl2

(ipl

,init program loader

)和nbl3

(upgrade tools

),其中

nbl1

和nbl2

共同儲存在

flash

的第乙個

block

中,flash

晶元在生產的時候廠商都會特別保障這些

block

的可靠性,特別是儲存了最開始

bootloader

**和ipl

的第一塊。按經驗來講,

nbl的三個模組加起來一共大約

400多

k,其占用的

10塊的

block

=128k

×10 byte

的空間大部分是空餘的,為了下面敘述方便,這裡假設

nbl3_end_blcok

為nbl

的最後的

block

編號。 2)

binfs

分割槽緊接著

bl分割槽,即

ce_start_block=nbl3_end_blcok+1

,然後一般會將

binfs

分割槽的第乙個塊存放

mbr,

mbr在這裡僅僅是個標誌,不像

pc的硬碟中的

mbr主要用來儲存分割槽表的資訊和引導**。所以

binfs

分割槽中儲存

os資料的起止

block

範圍為ce_start_block+1

到ce_start_block+ce_max_block

為止,我接觸的專案中其大小一般為

250個塊左右,大約等於

30mbytes

,wince

的image

一般不會超過這個大小,如果需要可以在分割槽時加大它的大小。 3

)flash

的檔案分割槽就是將剩下的

block

模擬成為和硬碟,

cf卡類似的塊裝置讓

wince

載入成碟符使用。

現在回到正題:如何計算

checksum。

1)ut的

checksum計算

ut的bin檔案是由

bootloader.bin

(nbl1

),ipl.bin

(nbl2

)和upgradetools.bin

(nbl3

)這三檔案打成的乙個封包,然後用

pc上的

checksum

工具計算出

checksum

值,我們的目的就是在

wince

起來後用

ap能通過讀

flash

的nbl

的三個分割槽並實時計算到這個值。 ut

的bin

檔案最後會被完整的燒寫到

nand flash

的編號為0到

nbl3_end_blcok

的block

中(雖然會被分為三塊燒,但是資料是完整的),具體占用多少

block

由bin

檔案的大小決定,剩餘的空間會以

0填滿。雖然不知道

bin檔案具體的結尾的位置,但是知道剩餘空間填

0的這個特性後,我們就可以直接呼叫

nand flash

的驅動程式,而且可以使用輕量級的不帶壞塊管理的驅動**直接去讀0到

nbl3_end_blcok

的所有資料,然後把每個

byte

累加起來就能得到

checksum

的值了。 2

)img

的checksum計算

大家都知道,如果定義了

multixip region

的話,wince

的image

用romimage

編譯出來會生成多個

bin檔案,這裡假設我們在配置

image

的bib

檔案中定義了兩個

region

:xipkernel和nk

,那麼在執行

romimage ce.bib

之後我們會得到

xipkernel.bin

,nk.bin

,chain.bin

三個檔案,最後呼叫

makebinfs

生成乙個

ceimgb.nb0

的image

映象檔案,我們也會先用

checksum

工具對ceimgb.nb0

進行運算得到其完整的

checksum值。

燒寫的過程和

ut有兩點不同:

1)燒寫內容選擇上,ut的

bin檔案的所有資料會被燒入

flash

,而img

的映象檔案包含了一些不需要燒入的頭資訊,所以可能導致燒入

flash

的資料不完整;

2)燒寫使用的

nand flash

的函式不一樣,因為

img燒寫在

flash

中的位置位於普通的不受特殊保護的塊區,所以要考慮到壞塊的管理,所以在呼叫具體的讀寫介面的時候要使用較高一層的**,拿

samsung

的flash

驅動poketstoreii

為例,燒寫

ut時用的讀寫函式為

nf_readpage

,而燒寫

img映象使用的時

stl_read/write。

第乙個不同點決定了我們如果要能計算得到正確的

img的

checksum

值則必須將沒有燒入到

flash

中的ceimgb.nb0

的頭部資料燒寫到為儲存

img預留的並且沒有被占用的

flash

中,比如

img預留空間的最後一塊,塊號為

ce_start_block+ce_max_block

。我們通過修改燒寫

img的**,在燒寫完

img的三個

bin的資料後把從

0x0到

0x248(

記不太清楚,大概

)的資料寫到塊

ce_start_block+ce_max_block

中。這樣的話因為其他的空餘空間被

0填充,我們就可以呼叫

stl_read

把從ce_start_block+1(+1

是為了略過

mbr塊)到

ce_start_block+ce_max_block

資料全讀取出來並且累加得到最後的

checksum

值。  

flash分割槽的意義

所謂分割槽,就是說對flash進行分塊管理。如何方便地進行分塊管理 儲存裝置型別和數量 對flash 相當於硬碟 的管理必須事先使用分割槽界定 uboot中和kernel中都有個分割槽表,分割槽表就是我們在做系統移植時對flash的整體管理分配方法。有了這個界定後,我們在部署系統時按照分割槽界定方法...

uboot對Flash和DDR的分割槽管理

1 uboot階段對flash的分割槽 1 所謂分割槽,就是對flash進行分塊管理。2 pc機等產品中,因為大家都是在作業系統下使用硬碟的,整個硬碟由作業系統統一管理,作業系統會使用檔案系統幫助我們管理磁碟空間。管理保證了檔案之間不會相互堆疊 於是乎使用者不用自己太多在意分割槽問題。3 在uboo...

uboot與kernel的flash分割槽

1.我們可以在uboot中修改flash分割槽。2.我們也可以在kernel中修改flash分割槽,但是需要與uboot中的分割槽表一致。3.我們可以通過uboot用引數傳給kernel分割槽資訊,這樣只需要維護uboot的分割槽表即可。這要對bootloader對核心重新分割槽 這需要重新設定一下...