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分析相关推荐
- 计算机桌面键盘快速启动,效率神器!1秒打开电脑任何软件,推荐2款强大的快速启动器...
原标题:效率神器!1秒打开电脑任何软件,推荐2款强大的快速启动器 如果你是一位桌面极简主义者,不喜欢在电脑桌面上放满各种软件的快捷方式:那么,今天给你介绍的2款软件快速启动器,能快速提升工作效率,相信 ...
- 计算机软件快速启动,效率神器!1秒打开电脑任何软件,推荐2款强大的快速启动器...
原标题:效率神器!1秒打开电脑任何软件,推荐2款强大的快速启动器 如果你是一位桌面极简主义者,不喜欢在电脑桌面上放满各种软件的快捷方式:那么,今天给你介绍的2款软件快速启动器,能快速提升工作效率,相信 ...
- RK3399快速上手 | 03-RK3399启动流程分析
文章目录 一.Rockchip处理器通用启动流程 1. 启动路径 2. 启动阶段 3. 启动流程分析 3.1. 图示 3.2. 第一阶段 3.3. 第二阶段 3.4. 第三阶段 3.5. 第四阶段 3 ...
- imx8mq-evk快速启动-方案讨论,准备工作
一.优化启动时间的流程 1.系统启动流程:先使用nxp提供的系统方案启动系统.分析系统启动流程.优化启动时间工作在验证系统必须功能正常的前提下进行.系统可以独立下载源码进行编译,也可以通过yocto工 ...
- 有关Win8快速启动机制探讨
Win8个性化:一个花费两三年时间,数千人开发,参与测试人数达到数百万的产品,其中必然有不少值得我们去探讨分享的新技术和新功能,Win8正是这样一款产品.作为世界上最流行的操作系统的最新版本,Win8 ...
- 记一次windows蓝屏的解决方法——快速启动惹的祸
现象 公司电脑,Windows10 系统,我一般周一到周四不关机只休眠,一切正常,周五下班关机,可是到下周一过来开机必蓝屏(100%蓝屏),强制关机重启后又一切正常了. 后面反复测试了几次,发现只要是 ...
- xp启动java设置_Windows XP快速启动经典六招
Windows XP快速启动经典六招 第一招:修改启动参数 右键单击"我的电脑",选择"属性",再单击"高级"选项卡,单击"启动和 ...
- 解析并符号 读取dll_Spring IOC容器之XmlBeanFactory启动流程分析和源码解析
一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...
- android 快速启动,《Android APP可以有的东西》之显示篇:快速启动App
前言 又有好久木有更新啦,快成咸鱼了. 早上看到一篇关于app快速启动的公众号文章,觉得应该全面了解一下这个东西,所以这篇文章就小小地实践一下下记录下来,内容并不多,demo都没有必要上,大家直接看代 ...
最新文章
- python动态数组的最大值_python实现动态数组的示例代码
- wukong引擎源码分析之索引——part 2 持久化 直接set(key,docID数组)在kv存储里...
- 【开发环境】安装 Visual Studio Ultimate 2013 开发环境 ( 下载软件 | 安装软件 | 运行软件 )
- Rexsee API介绍:Android传感器系列之 - 磁场传感器Magnetic Field源码
- MTK 快速开机 技术详解
- 1746: 多项式系数(杨辉三角的应用)
- UIWindow的windowLevel详解
- 2016年安全身份识别主流趋势
- html判断坐标,js判断鼠标位置是否在某个div中的方法
- ELKStack之极速入门(上)
- JavaScript小数运算出现多位的解决办法
- Since Due to Because of Because 的用法和区别
- linux设置mysql开机启动
- Linux 查看本地ip
- 新手网站制作教程:网站建设流程及步骤有哪些?
- MobileNet v2的Inverted Bottleneck为什么可以抵消ReLU激活函数所带来的信息损失
- matlab将图片旋转的代码_空间曲线绕空间直线旋转生成的旋转曲面方程
- 最新Exsi-6.7.0U3b版本下载
- 为什么电子邮件发送失败?电子邮件发送失败的原因及解决方法
- 青少年软件编程C++一级题库(51-60)
热门文章
- numpy将所有数据变为0和1_Numpy库学习
- arrayrand php,php中array_rand函数的功能起什么作用呢?
- 28 | 堆和堆排序:为什么说堆排序没有快速排序快?
- linux使用root操作文件,以root用户登录Linux系统,当前目录是/root,要求完成如下操作和功...
- mysql 字符转数值_深入MYSQL字符数字转换的详解
- 2013年c语言课后作业答案,2013年计算机二级C语言课后模拟题三及答案
- 单元测试debug过程中,显示variables are not available
- ubuntu下的对拍
- word 2013 题注、图注、插入图片自动修改大小、批量更新题注编号
- 解决鼠标滚动的时候多次执行函数