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對核心重新分割槽 這需要重新設定一下...