启动过程为何需要设计如此复杂?
原因在于器件(芯片)本身的特性,常用器件特性如下:
内存:
SRAM(静态内存) 缺点:容量小、价格高、优点:访问速度快、不需要软件初始化,上电直接使用(内部实现电路决定)
DRAM(动态内存) 优点:容量大、价格低、缺点:访问速度慢、需要软件初始化,上电不能直接使用(内部实现电路决定)
外存:
NorFlash: 缺点:容量小、价格高、优点:访问速度快、能直接总线式访问(上电后CPU可以直接读取,一般做启动介质)
NandFlash: 优点:容量大、价格低、缺点:访问速度慢、不能总线式访问(上电后CPU不能直接访问,需要软件初始化后才能使用)
单片机:内存需求量小,适合用:
- SRAM+NorFlash
嵌入式系统:内存需求量大,软件复杂、适合用:
- DRAM+NorFlash
- DRAM+NandFlash
- DRAM+NorFlash+NandFlash
PC设备: 内存需求量大,软件复杂、存储需求大、适合用:
- DRAM(DDRx)+NorFlash(BIOS)+大容量硬盘
S5PV210(SOC)启动方式:
内置IROM(SROM 64KB)+内置IRAM(SRAM 96KB)+外接DRAM+外接NandFlash(针对实际开发板硬件决定)
S5PV210启动过程:如下图
- iROM can do initial boot up : initialize system clock, device specific controller and booting device.
- iROM boot codes can load boot-loader to SRAM. The boot-loader is called BL1.then iROM verify integrity of BL1 in case of secure boot mode.
- BL1 will be executed: BL1 will load remained boot loader which is called BL2 on the SRAM.then BL1 verify integrity of BL2 in case of secure boot mode.
- BL2 will be executed : BL2 initialize DRAM controller then load OS data to SDRAM.
- Finally, jump to start address of OS. That will make good environment to use system.
- CPU上电后先从内部IROM(soc内部NORFLASH,64KB)中读取预先设置的代码(BL0),执行。(只能初始化SOC内部设备,如时钟、关闭watchdog…..)
- 上段代码判断OM引脚的启动方式.然后到相应外部存储设备去读(块设备copy函数)取第一部分(BL1<=16KB)启动代码到内部IRAM(96KB)中,执行(负责初始化nandFLASH),然后将BL2读取到IRAM(剩余80KB)中执行.
- 上段BL2执行后(负责初始化DRAM)将OS从NAND读取到DRAM,启动OS。
- CPU上电后先从内部IROM(soc内部NORFLASH,64KB)中读取预先设置的代码(BL0),执行。(只能初始化SOC内部设备,如时钟、关闭watchdog…..)
完整引导流程:如下图
BL0、BL1内存地址映射: 如下图
BL0:
1. Disable the Watch-Dog Timer (关闭看门狗) 2. Initialize the instruction cache (初始化指令缓存) 3. Initialize the stack region (初始化栈) 4. Initialize the heap region. (初始化堆) 5. Initialize the Block Device Copy Function. (初始化块设备复制函数) 6. Initialize the PLL and Set system clock. (初始化并设置时钟系统) 7. Copy the BL1 to the internal SRAM region (复制BL1到内部IRAM) 8. Verify the checksum of BL1.If checksum fails, iROM will try the second boot up. (SD/MMC channel 2) (检查BL1的校验和,如果校验和失败,尝试二次启动) 9. Check if it is secure-boot mode or not. (检查是否是安全模式启动) 10. Jump to the start address of BL1 (跳转到BL1执行)
BL1的结构(BL1+Header):如下图:
BL1:
实际启动程序(部分Bootloader)或者裸机程序,用户自己决定……
后续裸机程序都是通过USB DNW下载到BL1的执行地址上(0xD002 0010),CPU把用户写的裸机程序当做启动程序了……