以S3C6410 为例子,S3C6410 的内部SRAM 地址为0x0C00 0000 ~ 0x0C00 1FFF,DRAM 的Base 地址为0x50000000 ,S3C6410 支持NAND,SD 启动,S3C6410 里面有固化的ROM, 当系统上电的时候,将执行固化ROM 中的代码,然后检查硬件的GPIO 配置,如果配置成NAND 启动,则把NAND 的前8K 读入内部的SRAM(stepping Stone)中,然后跳转到 Stepping Stone 的开头,执行Bootloader1 (也就是下文的stepldr), stepldr 负责把eboot 从NAND中搬到DRAM 中,然后执行eboot( boot loader 2),eboot 通过网络下载 NK.bin 或者从NAND 中把内核搬到DRAM 中,然后执行WINCE 内核.所以整个启动过程分为三阶段,stepldr -->eboot --> wince kernel . 下面详细地分析各个阶段. 一 bootloader 1 stepldr 从stepldr 的startup.s 开始.startup.s 主要是初始化硬件,中断,配置好C 运行的环境,然后跳转到main 函数中,执行C 代码. startuo.s 的流程是 : startup --> Enable I cache -->关闭watchdog ,Interrupt dosable -> 时钟初始化 --> 初始化DRAM 控制器 --> 初始化IRQ,SVC stack --> 判断是否睡眠 ---N--> Clear DRAM -->main --Y-> 跳到NK 的开头 (也就是DRAM + 0x100000 的地方) main.c : UART 初始化 --> nand 初始化 -> 从NAND 中把eboot 搬到DRAM 中 -->跳转到 eboot的开头 我们看代码有2 个全局变量。 ROMHDR * volatile const pTOC = (ROMHDR *)-1; 这个在 ROMImage 里面会赋值。 static BOOL g_bLargeBlock = FALSE; // For Large Block Check 这两个全局变量的位置为:500F0000 根据 stepldr.bib 二 bootloader 2 eboot startup.s startup --> Enable I cache -->关闭watchdog ,Interrupt dosable -> 时钟初始化 --> Disable VIC --> enable 中断 -->CLEAR DRAM(从1M 到128M 地址的DRAM,因为低 1M 地址 空间目前放的是eboot ) --> 初始化MMU Table (根据 g_oalAddressTable,把DRAM 的Base地址0x50000000 映射到0x80000000,此后地址都用虚拟地址) --> 初始化IRQ,SVC stack --> -->main main.c main --> BootloaderMain BootloaderMain 的流程: KernelRelocate -->OEMDebugInit(初始化串口,这样就可以打印信息了) -->OEMPlatformInit -->OEMPreDownload -->DownloadImage-->OEMLaunch (切...