WINCE6.0+S3C2443的启动过程---eboot6
********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
時間:2010.11.01
類別:WINCE驅動開發
********************************LoongEmbedded********************************
2.6 OEMLaunch
BootloaderMain函數接下來會調用OEMLaunch函數,
?
圖1
下面來學習OEMLaunch的主要函數體
2.6.1 WriteOSImageToBootMedia函數
?
圖2
下面就進去學習WriteOSImageToBootMedia的主要函數體
⑴查找當前下載的映像中是否包含有NK.exe并且返回其擴展指針
?
?
圖3
⑵標識nboot,TOC和eboot保存的block的只讀信息等,并且擦出eboot之后的所有block。
?
圖4
⑶調用BP_LowLevelFormat來格式化所有存儲空間
該函數于級格式化,格式化Flash設備Block,重新創建MBR并MBR存第個Blockd第個扇區。dwStartBlock起始Block,dwNumBlocks多少個Block,dwFlags格式化標記位,表示采何種格式化方式。該函數根據需由EBOOT函數調。
?
圖5
我們來看PB中對BP_LowLevelFormat的說明
?
?
圖6
MBR: master boot sector, MBR在CE中主要是記錄后面的存儲器空間是如何分區的,這個記錄應該和PC上是一樣的,起始sector號碼,總共有幾個Sectors,分區使用什么文件系統(這里是BINFS文件系統,)。但是不同的是,MBR不需要承擔引導代碼的功能,在MBR之后,按照分區記錄中的起始地址,就是各個分區。
?
BINFS: Binary Romimage File System
BINFS就是MS給CE做的一種存放系統鏡像的一個文件系統,這其實就是一個結構體(說是文件系統確實比較勉強,結構體可能更合適),里面有記錄各模塊的起始地址,大小等的信息,你要找模塊可以根據這個信息到后面找。
?
⑷在把SDRAM中的NK燒寫到NAND中去之前,先調用BP_OpenPartition來創建一個BINFS分區,建好之后將nk.bin燒入BINFS分區中。
?
圖7
我們來看BP_OpenPartition在PB中的描述
?
圖8
⑸BP_SetDataPointer
該函數用于設置某一個分區的數據指針,實際上數據指針是指在該分區中下一次被讀或寫的位置。一般會配合BP_ReadData(..)和BP_WriteData(..)兩個函數來用。hPartition為被創建分區的句柄,dwAddress為數據指針的新位置。
?
圖9
⑹調用BP_WriteData 往BINFS分區里面寫入數據nk.bin
?
圖10
BP_WriteData函數最終會調用到flash驅動的函數來寫數據。
?
⑺更新TOC和把內核拷貝到SDRAM中,為下一步的跳轉執行做準備。
?
圖11
⑻為系統創建擴展分區
?
圖12
到此nk.bin對應的MBR也創建了,nk.bin也寫進去了,對應的位于1塊的TOC數據也更新了,擴展分區也創建了,工作完成了,返回ok,假如把圖12部分代碼注釋掉,系統啟動會停止在串口輸出的下面信息處
#### FMD_DRIVER:::FMD_OEMIoControl
FMD_OEMIoControl: unrecognized IOCTL (0x71c24).
到此就返回WriteOSImageToBootMedia函數了
?
2.6.2 得到更新后的TOC信息并寫回到TOC所在的block中。
?
圖13
2.6.3 調用函數Launch跳轉到OAL.exe的startup函數執行,從此eboot階段的任務就完成了,開始進入OAL.exe,也即進入NK的啟動過程了。
?
?
圖14
總結
以上是生活随笔為你收集整理的WINCE6.0+S3C2443的启动过程---eboot6的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eboot 中给nandflash分区实
- 下一篇: ARM汇编 beq和bne