WinCE開發中Boot Loader的點點滴滴

2021-08-25 03:53:12 字數 2418 閱讀 2271

我很慶幸在公司的產品開發過程中並沒有受到boot loader帶來的阻力,因為我們採用msdos+loadcepc來啟動ce作業系統。顯然這樣的幸運不是永遠的,所以對boot loader應該有足夠的研究和了解,做到未雨綢繆。

boot loader是定製windows ce作業系統過程中乙個重要的開發環節。boot loader的作用正如名字中的兩個單詞:boot,既引導系統,如果基於ce的產品採用bios實現硬體初始化和配置,那麼boot loader只需引導軟體系統。如果沒有採用bios,那麼boot loader的作用還包括實現bios的基本功能;loader,既載入作業系統,在整個系統正常啟動後boot loader通過不同的方式載入ce的核心檔案nk.bin。當boot loader把nk.bin解壓到ram後就把cpu控制權交給ce核心。x86平台的boot loader種類最多,下面就對x86平台的boot loader做一說明:

x86 rom boot loader

x86 bios boot loader

bios boot loader和msdos+loadcepc兩種方式差不多,bios boot loader只是不需要msdos作業系統,它仍然需要bios和fat檔案系統。下面講一下採用bios boot loader的系統的引導順序:系統上電後bios執行完硬體初始化和配置後,bios檢查引導裝置的啟動順序,如果引導裝置是硬碟、cf卡、doc(disk-on-chip)一類的儲存裝置,那麼就載入這些儲存器上的主引導扇區(master boot sector)中的實模式**到記憶體,然後執行這些**。這裡提到的**被稱為主引導記錄(mbr)。mbr首先在分割槽表(同樣位於主引導扇區)中尋找活動分割槽,如果存在活動分割槽,那麼載入位於這個活動分割槽的第乙個扇區上的**到記憶體,然後執行這些**。這裡提到的活動分割槽的第乙個扇區被稱為引導扇區(boot sector)。引導扇區上的**的功能是找到並且載入bios boot loader,bios boot loader再載入nk.bin。引導扇區的原始碼位於%_winceroot%/public/common/oak/csp/i486/biosloader/bootsector目錄下。有乙個現成的引導扇區映象檔案,它的路徑為%_winceroot%/public/common/oak/csp/i486/biosloader/diskimages/setupdisk/bsect.img 。而對於bios boot loader,ce提供了setupdisk.144和bootdisk.144兩個檔案,以「.144」為副檔名的檔案的解壓我在前面的文章中講過了。這兩個檔案解開後都包含了引導扇區和boot loader的映象檔案。執行「mkdisk c:」批處理命令將這兩個映象檔案寫到磁碟上。mkdisk會設定boot loader的隱藏屬性,這樣在列出根目錄下所有檔案時不會顯示boot loader的檔案。

msdos+loadcepc

這種方式非常簡單,在msdos啟動後再執行loadcepc.exe,讓loadcepc載入nk.bin到記憶體後再把cpu控制權交給ce核心程式。loadcepc在前面的文章中已經講過了。

下面根據一般的boot loader原始碼來分析一下boot loader的組成:

boot loader由兩部分組成:oem啟動**(oem startup code)和主**(main code)。oem啟動**是最先執行的部分,它的功能是初始化記憶體暫存器、設定cpu頻率、初始化快取記憶體等。之後它跳轉到主**中執行。一般oem啟動**都是用彙編編寫。主**一般用c語言編寫,它負責其它所有任務,在執行的同時還能夠將執行的相關資訊顯示在螢幕上。一般新增公司logo或者其它啟動logo都在此修改。

一般的boot loader的執行流程見下圖:

上圖中每個函式的功能如下:

startup() :cpu最先執行的函式。也就是啟動**。

bootloadermain() :先後呼叫kernelrelocate、oemdebuginit、oemplatforminit、oempredownload等函式。此函式原始碼檔案路徑為%_winceroot%/public/common/oak/drivers/ethdbg/blcommon 。

oemdebuginit() :初始化串列埠。

oemplatforminit() :執行特定平台的初始化工作,如時鐘、一些驅動程式。

oemlaunch() :負責啟動映象。

oemreaddata() :從遠端計算機讀取資料。

oemmapmemaddr() :專用於寫flash時使用。因為寫flash的速度非常慢,所以此函式將flash映象臨時緩衝到ram中。

oemshowprogress() :從函式名就能看出。

oemfinisheraseflash() :判斷是否完成了擦除flash內容工作。

oemwriteflash() :寫映象到flash。

oemstarteraseflash() :開始擦除flash。

oemcontinueeraseflash() :繼續擦除flash工作。

WinCE中nandflash驅動開發介紹

這裡介紹nandflash驅動,在wince中,有專門針對flash儲存裝置驅動的支援,一般傳統採用fal fmd的架構。在wince最新的版本中,也就是windows ce6.0 r2中,還支援mdd pdd的架構。在fal fmd架構中,fal層由微軟來實現,我們需要實現fmd層的相關介面函式。...

WinCE中nandflash驅動開發介紹

這裡介紹nandflash驅動,在wince中,有專門針對flash儲存裝置驅動的支援,一般傳統採用fal fmd的架構。在wince最新的版本中,也就是windows ce6.0 r2中,還支援mdd pdd的架構。在fal fmd架構中,fal層由微軟來實現,我們需要實現fmd層的相關介面函式。...

WinCE開發中Boot Loader的點點滴滴

wince開發中boot loader的點點滴滴 boot loader是定製windows ce作業系統過程中乙個重要的開發環節。boot loader的作用正如名字中的兩個單詞 boot,既引導系統,如果基於ce的產品採用bios實現硬體初始化和配置,那麼boot loader只需引導軟體系統。...