Windows CE6.0作業系統映像檔案格式的研究

來源:互聯網
上載者:User

 

     把前段時間研究的關於BIN檔案的一些認識,整理了一下,寫了一篇文章,投了出去,將於年底發表。最近,也沒有幹什麼事,一直閑著,偶爾看看C#,也沒有什麼好些的,預示將我寫文章用到的素材,以及寫文章用到的一些資料整理了一下,寫了出來,文章已經發表,希望對同學們有個借鑒,請勿抄襲!

    由Windows CE的開發工具Platform Build編譯產生的Windows CE作業系統及Bootloader的鏡像檔案主要由兩種格式類型——以.bin為檔案名稱尾碼的記錄型鏡像檔案和以.nb0為尾碼的原始型(raw)鏡像檔案,前者以記錄(Record)為單位組織鏡像的資料,後者則是鏡像在嵌入式系統中運行時的位元據快照。

DownloaderImage函數執行的第一步是調用GetImageType函數獲知鏡像檔案的格式類型。GetImageType也是BLCOMMON庫函數,與DownloadImage函數在同一源檔案中實現。GetImageType函數查詢鏡像檔案格式類型的原理十分簡單:每一個Windows CE鏡像檔案在檔案資料的起始位置都有一個7位元組的特徵碼(magic number),它與鏡像檔案的格式一一對應如下:

“N000FF\X0A”——BL_IMAGE_TYPE_MANIFEST

“X000FF\X0A”——BL_IMAGE_TYPE_MULTIXIP

“B000FF\X0A”——BL_IMAGE_TYPE_BIN

“S000FF\X0A”——BL_IMAGE_TYPE_SIGNED_BIN

“R000FF\X0A”——BL_IMAGE_TYPE_SIGNED_NB0

無特徵碼——BL_IMAGE_TYPE_UNKNOWN

 

typedef enum _BL_IMAGE_TYPE

{

    BL_IMAGE_TYPE_MANIFEST = 0,

    BL_IMAGE_TYPE_BIN,

    BL_IMAGE_TYPE_NB0,

    BL_IMAGE_TYPE_SIGNED_BIN,

    BL_IMAGE_TYPE_SIGNED_NB0,

    BL_IMAGE_TYPE_MULTIXIP,

    BL_IMAGE_TYPE_UNKNOWN,

    BL_IMAGE_TYPE_NOT_FOUND,

} BL_IMAGE_TYPE;

以上的前4種類型都是記錄型鏡像格式,只有BL_IMAGE_TYPE_SIGNED_NB0代表原始型鏡像檔案格式,此外DOwnloaderImage函數把無特徵碼的BL_IMAGE_TYPE_UNKNOWN類型也當作原始型鏡像來處理。BL_IMAGE_TYPE_MULTIXIP類型在Windows CE 5.0和以前的版本中用於表示多區段的鏡像檔案,在Windows CE 6.0版本中使用BL_IMAGE_TYPE_MANIFEST類型處理多區段的作業系統鏡像,不再支援BL_IMAGE_TYPE_MULTIXIP類型,僅為了在原始碼中保持向下相容而保留該類型的定義。

BL_IMAGE_TYPE_MANIFEST類型的鏡像檔案的資料是多區段的記錄型鏡像檔案的區段(Region)資訊。多區段的鏡像,簡單地說,就是作業系統或者BootLoader的二進位運行時位元據分散在不連續的實體儲存體區間。Manifest的字面意思是“載貨單”,該類型的鏡像檔案並不是真正的Windows CE作業系統的或者BootLoader的二進位運行時資料,只是供下載多區段型鏡像所使用的頭資訊。由於鏡像資料的性質特殊,“N000FF\X0A”——BL_IMAGE_TYPE_MANIFEST類型的鏡像檔案——也稱作Manifest資料——與一般的鏡像檔案資料的存放位置不同,它使用專門的DowloadManifest型全域變數g_DownloadManifest來存放。

DowloadManifest結構體類型在標頭檔%_WINCEROOT%\PUBLIC\COMMON\OAK\INC\blcommon.h中定義如下:

// Download manifest.

typedef struct _MultiBINInfo_

{

    DWORD      dwNumRegions;         // Number of files to be downloaded,要下載的bin檔案數目

    RegionInfo Region[BL_MAX_BIN_REGIONS];

} MultiBINInfo, *PMultiBINInfo;

typedef MultiBINInfo DownloadManifest;

typedef MultiBINInfo *PDownloadManifest;

多區段意味著多檔案,即一個作業系統或者BootLoader的二進位運行時資料存放在多個鏡像檔案中,這多個鏡像檔案的資料對應於可以連續也可以不連續的多個實體儲存體地區。DowloadManifest結構體的成員dwNumRegion就是多區段鏡像的區段個數,也即是後續多個鏡像檔案的檔案個數。Region數群組成員負責具體存放各區段的資訊,BL_MAX_BIN_REGIONS在標頭檔%_WINCEROOT%\PUBLIC\COMMON\OAK\INC\blcommon.h中定義為25,意味著多區段的鏡像區段數最大不超過25。Region數群組成員的元素類型RegionInfo又是一個在標頭檔blcommon.h中定義的結構體:

// Download file info (start address, length, filename, etc.).下載檔案資訊

typedef struct _RegionInfo_

{

    DWORD dwRegionStart;

    DWORD dwRegionLength;

    CHAR szFileName[MAX_PATH];

} RegionInfo, *PRegionInfo;

RegionInfo結構體的3個成員dwRegionStart、dwRegionLength、szFileName含義分別是一個鏡像區段在實體儲存體中的起始地址、以位元組為單位的區段長度和與鏡像區段相對應的鏡像檔案名。

對於BL_IMAGE_TYPE_MANIFEST類型的鏡像檔案,檔案資料中緊隨7位元組的格式類型特徵碼之後下載連接埠讀出的是4位元組的校正資料,繼之是4位元組的區段個數。區段個數資料理所當然存放在g_DownloaderManifest全域變數的dwNumRegions成員中,隨後依次讀出的是鏡像的g_DownloaderManifest.dwNumRegions個區段的屬性資料——起始地址、區段長度、區段資料的鏡像檔案名,按順序存放在g_DownloaderManifest.dwNumRegions數組的各個元素中。DownloaderImage函數調用CheckImageManifest函數讀取4位元組校正資料和隨後的全部Manifest資料,然後CheckImageManifest函數調用VerifyChecksum函數對Manifest資料執行校正,不過校正範圍僅限於存放在g_DownloaderManifest.Regions數組中的區段頭資訊的資料,不包括4位元組的g_DownloaderManifest.dwNumRegions的資料。

BL_IMAGE_TYPE_MANIFEST類型在所有的鏡像檔案格式類型中比較另類,它只是供下載其他類型的鏡像檔案而是用的前置資訊,本身並不包含有效Windows CE作業系統或者BootLoader的二進位運行時資料。如果作業系統的鏡像只有一個區段,或者使用自身包含有儲存位置等頭資訊的記錄型鏡像檔案格式,也可以不使用Manifest前置資料。BL_IMAGE_TYPE_MANIFEST類型的鏡像檔案下載完成以後,DownloaderImage函數並不立即執行返回,還要依據全域變數g_DownloaderManifest中的Manifest資料所提供的資訊繼續下載裝載有真實的作業系統位元據的鏡像檔案。

BL_IMAGE_TYPE_BIN類型是最普通最常用的記錄型鏡像檔案格式,該類型的鏡像檔案均以.bin為檔案名稱尾碼,DownloaderImage函數調用DownloadBin函數處理這種類型的鏡像檔案,DownloaderImage也是一個BLCOMMON庫函數。在BL_IMAGE_TYPE_BIN類型的鏡像檔案中,緊隨著最初的7位元組特徵碼之後是該鏡像檔案在嵌入式系統中的目的實體儲存體起始地址和以位元組為單位的長度,各佔4位元組,這兩個資料的含義分別對應於RegionInfo結構體的dwRegionStart、dwRegionLength兩成員。接下來的便是具體存放作業系統為位元據的擁有相同結構的多條記錄(Record),每條記錄由4位元組的記憶體起始地址dwRecAddr、4位元組的記錄長度dwRecLen、4位元組的校正碼dwRecChk和dwRecLen個位元組的記錄資料群組成。DownloaderImage函數依次從下載連接埠讀出各條記錄並且對它們執行校正,校正也是以記錄為單位,待校正無誤以後將去除頭資訊的記錄資料存放到dwRecAddr指定地址的實體儲存體位置。如果記錄的目的儲存位置是FLlash存放裝置,則通常要先緩衝在RAM記憶體中,待整個鏡像檔案全部下載完再一起寫入FLlash。

與BL_IMAGE_TYPE_BIN類型相似的最普通常用的原始型(Raw)鏡像檔案以.nb0為檔案名稱尾碼,它們使用DownloaderNB0函數進行處理。由於原始型鏡像檔案的資料只是實體儲存體中的Windows CE作業系統或者BootLoader的二進位運行時資料的一個最直接的快照,所以它是完全無格式的,甚至都沒有7位元組的特徵碼,在GetImageType函數中將這種鏡像檔案格式類型定義為BL_IMAGE_TYPE_UNKNOWN。通常情況下,DownloaderImage函數將無特徵碼的BL_IMAGE_TYPE_UNKNOWN類型都當作原始型鏡像檔案處理,但是在安全性較高的情況下(定義了宏SECURE_BOOTLOADER)無特徵碼的鏡像檔案是不應該被Bootloader接受的。原始型鏡像檔案的處理方法最簡單,BootLoader只需從下載連接埠中讀出全部的鏡像資料並且存放到相應的儲存位置,而且無需處理校正。原始型鏡像檔案的資料在實體儲存體中的起始地址和長度都取決於Manifest資料,因而.nb0型的鏡像檔案不能單獨下載,BootLoader必須先下載作為它的前置屬性資訊的BL_IMAGE_TYPE_MANIFEST類型的鏡像檔案。

.bin檔案是一個描述性質的映像檔案,它由檔案頭(head)、鏡像資料目的起始地址(ImageStart)、鏡像資料長度(ImageLength)和多條相對獨立的記錄(record)構成。檔案頭(head)由7個位元組組成,內容是:42 30 30 30 46 46 0A,即“B000FF\x0A”,這是判斷鏡像檔案是.bin類型的依據。鏡像資料目的起始地址(ImageStart)由4個位元組組成,它定義了鏡像檔案解析後裝載在記憶體中的起始地址。鏡像資料長度(ImageLength)也由4個位元組組成,它表示.bin鏡像檔案解析後在記憶體中佔用的總的儲存空間大小。每條記錄(record)由4位元組的起始儲存地址(RecordStart)、4位元組的資料長度(RecordLength)、4位元組的校正碼 (RecordCheckSum)和RecordLength個位元組的記錄資料(RecordData)組成。

 由以上.bin的檔案格式可知,.bin檔案不是記憶體程式空間的一個簡單的拷貝。所以它不能直接用串口燒寫進記憶體或FLASH空間來直接運行,必須通過 PB下載,通過EBOOT按照.bin檔案的格式解析出來具體的內容並重新裝載後才能運行。

 而.nb0檔案就不一樣,它是記憶體運行程式映像的一個硬拷貝,其資料內容和程式運行時在記憶體中的資料是一樣的。鑒於此,.nb0可以通過串口下載到指定的位置直接運行。很明顯,.nb0是一個不存在格式的映像檔案。

   

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.