wince2秒快速启动TOC分析
為什么29M的wince內核nk.nb0文件在2秒鐘就能快速啟動,如果你用匯編設計一個從NAND單純拷貝29M nk.nb0的快速程序,你會發現用200MFCLK的2410或者用400MFCLK的2440都至少需要十幾秒,那為什么ce能夠啟動這么快呢,有什么加速算法嗎?答案是肯定的,并不需要一次性將所有nk.nb0數據都加載到內存,應該按需加載,那就是ce的鏡像文件image“按需加載”[“段式加載”]方式,TOC就是用來描述ce內核鏡像文件image的xipkernel段核心結構體,我們只需加載核文件xipkernel就能正常啟動進入wince界面。
------------------------------------------------------------
硬件環境QT2440A:
NAND[K9F1208U0C]-64M(啟動)
Block0-加載Block2內容的loader程序
Block1-512字節的TOC結構體存儲空間
Block2-加載umon或者結合TOC加載nk.nb0的loader程序
------------------------------------------------------------
?
typedef struct _TOC {
????//和CSW中的認證域類似,只用來驗證接下去內容的合法
DWORD?????????????? dwSignature;
//包含image的索引(我的是1)、啟動delay時間、ip地址、MAC地址和掩碼等
BOOT_CFG??????????? BootCfg;
//用來描述3個之多的ce內核image數組,我用的是id[1]
??? IMAGE_DESCRIPTOR??? id[MAX_TOC_DESCRIPTORS];
??? CHAININFO?????????? chainInfo;
} TOC, *PTOC;????????????????????????????????????????// 512 字節
?
typedef struct _IMAGE_DESCRIPTOR {
??? DWORD dwVersion;???????????????????????????????? //編譯時的版本號
??? DWORD dwSignature;?????????????????????????????? //“EBOOT”或“CFSH”等
??? UCHAR ucString[IMAGE_STRING_LEN];??????????????? //描述字符串:如"eboot.nb0"之類
?
??? DWORD dwImageType;?????????????????????????????? //image的類型nk.nb0為0x04
??? DWORD dwTtlSectors; ???????????????????????????? //image文件用到的NAND的扇區總數
?
??? DWORD dwLoadAddress;???????????????????????????? //image加載時的虛擬地址
??? DWORD dwJumpAddress;???????????????????????????? //image加載完成后的跳轉地址
?
??? SG_SECTOR sgList[MAX_SG_SECTORS];??????????????? //image的段描述,包括起始扇區號和所需扇區數目
?????? ULONG dwStoreOffset;
} IMAGE_DESCRIPTOR, *PIMAGE_DESCRIPTOR;
?
==========================
Loader的輸出:
'U' for USBMON
******
Total Sectors:0x0000e800
Sector addr on NAND: 0x000002a0
TotalSector: 0x0000e800
Reading Kernel Image from NAND
?
??? dwSector: 0x000002a0
??? dwLength: 0x0000e800
dwRAM: 0x30200000
==========================
eboot.nb0的輸出:
Microsoft Windows CE Ethernet Bootloader Common Library Version 1.0 Built Dec 20 2006 22:35:26
Copyright (c) 2000-2001? Microsoft Corporation
Microsoft Windows CE SMDK2440 Bootloader Version 1.2 Built Dec 20 2006 22:35:23
FMD::FMD_Init
?
FMD::FMD_Init Done
?
TOC_Read
TOC {
dwSignature: 0x434F544E
BootCfg {
? ConfigFlags: 0x3820
? BootDelay: 0xF
? ImageIndex: 1
? IP: 192.168.1.108
? MAC Address: 00:00:00:00:00:00
? Port: 0.0.0.0
? SubnetMask: 255.255.255.0
}
ID[0] {
? dwVersion: 0x10002
? dwSignature: 0x45424F54
? String: 'eboot.nb0'
? dwImageType: 0x2
? dwTtlSectors: 0x100
? dwLoadAddress: 0x8C038000
? dwJumpAddress: 0x8C038000
? dwStoreOffset: 0x0
? sgList[0].dwSector: 0x40
? sgList[0].dwLength: 0x100
}
ID[1] {
? dwVersion: 0x1
? dwSignature: 0x43465349
? String: ''
? dwImageType: 0x6
? dwTtlSectors: 0xE800
? dwLoadAddress: 0x8C200000
? dwJumpAddress: 0x8C201000
? dwStoreOffset: 0x0
? sgList[0].dwSector: 0x2A0
? sgList[0].dwLength: 0xE800
}
chainInfo.dwLoadAddress: 0X00000000
chainInfo.dwFlashAddress: 0X00000000
chainInfo.dwLength: 0X00000000
}
-TOC_Read
Press [ENTER] to download image now, or [SPACE] to enter boot monitor.
總結
以上是生活随笔為你收集整理的wince2秒快速启动TOC分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql字符串拼接_Mybatis的Sql
- 下一篇: 魅族PANDAER首款掌机来了:全球首款