首先明确bootloader的作用:就是把操作系统映像文件拷贝到RAM中去,然后跳转到它的入口处去执行 ,而操作系统文件的来源则是通过机台烧写。现在的bootloader还常常将操作系统映像文件写入FLASH:读取过来的操作系统文件,除了可以拷贝到RAM中直接运行,还可以烧录到FLASH,或者写入硬盘永久保存,这样下次就可以直接从本机来读取操作系统映像。
而且bootloader不是必须的,如果我们的硬件有足够大的norflash,并且实现了XIP技术,那么操作系统可以直接在norflash里面运行起来,不需要将它复制到RAM中去,所以bootloader就失去了作用。但是考虑到成本因素,现在的硬件一般都不会配置这么大的norflash,image文件都存储在nand flash里面,所以都会用到bootloader。
ROM(Read Only Memory,只读存储器)是只能读取,而不能随意写入信息的存储器。ROM中的内容是由厂家制造时用特殊方法写入的,或者要利用特殊的写入器才能写入。ROM的特性是,当计算机断电后,ROM中的信息不会丢失。刷机才能改变。
ROM的作用是:用于电脑中的开机启动,是完成系统的加电自检、系统中各功能模块的初始化、系统基本输入/输出的驱动程序和指导操作系统。
启动方式1:读Bootloader
cpu只会从0x0000_0000地址开始读程序。但是这个0x0000_0000,可以是0x0000_0000的rom的开始处,也可以是0x8000_0000的eflash的开始处。如果是通过rom启动,那便是使用Bootloader的方式进行启动。Bootloader可以帮助你完成FLASH里的Application的更新,而不需要使用额外的外部编程/调试器(比如JLink),除了Application更新之外,当然BootROM也可以完成Application的启动,Bootloader一般提供UART/SPI/I2C/USB接口与上位机进行通信,与Bootloader配套使用的还有一个上位机软件,当芯片从BootROM启动后,通过这个上位机软件与BootROM建立连接,然后可以将你的Application代码(bin/s19/hex格式)下载进芯片FLASH。
启动方式2:jtag
直接通过jtag管脚将程序写到flash
不管那种启动方式,启动后等flash里面有了数据,就将数据从flash搬ram运行。
RAM相当于内存,Flash相当于硬盘,编译器会将一个程序分为好几个部分,分别存储在不同的区域,一般分为以下几个部分:
1 code:代码段,存放程序的代码部分。
2 RO-data:只读数据段,存放程序中定义的常量。
3 RW-data:读写数据段,存放初始化未非零的变量。
4 ZI段:0 数据段,存放未初始化的变量和初始化为零的变量
因此,一个程序编译出来所占的Flash空间大小为
flash size = code + RO-data + RW-data
ram size = RW-data + ZI
程序下载到FLASH后,将RW-data搬运到RAM中运行,但是不会搬运RO段。
补充
从内部SRAM启动
SRAM存在于任何一款MCU中,它除了可以保存Application数据变量外,当然也可以存放Application代码以供CPU执行。但是SRAM是易失性存储器,存放的数据断电会丢失,所以从SRAM启动跟从FLASH/ROM启动性质不一样。
从FLASH/ROM启动属于一级启动,不依赖除了Boot Mode选择之外的条件;而从SRAM启动属于二级启动,其需要借助裸芯片本身之外的外力引导一下才能完成。外力引导的方式有两种:一是借助于外部调试器,直接将Application下载进SRAM并将PC指向Application开始执行,其实这就是所谓的在SRAM调试;二是借助于事先存储在FLASH/ROM中的Bootloader程序,Bootloader会将存放在FLASH(或其他非易失性存储器,或者从上位机直接接收)中的Application先加载到SRAM里然后Jump过去执行。
从外部存储器启动
有些MCU并没有内部FLASH,所以会支持外接存储器,常见的外部存储器有QSPI NOR/NAND, SD/eMMC, SDRAM, Parallel NOR/NAND, SPI/I2C EEPROM等,MCU内部集成相应的存储器接口控制器,通过接口控制器可以轻松访问这些外部存储器。一个没有内部FLASH的MCU肯定会有ROM(BootROM),因为必须要借助BootROM才能Boot存储在外部存储器的Application,所以从外部存储器启动也属于二级启动。
如何理解从外部存储器启动,需要解决下面的问题?
第一个问题:从外部NOR FLASH存储器启动(比如QSPI NOR/Parallel NOR/EEPROM)跟从内部FLASH启动有什么区别?
最大的区别是从外部NOR FLASH启动本质上属于二级启动,其无法像内部FLASH那样直接启动,需要由Bootloader引导。即使技术上可以做到存储在外部NOR FLASH里的Application能够原地执行(XIP),但也需要Bootloader完成外部NOR FLASH的初始化以及XIP相关配置。
第二个问题:从外部NAND FLASH存储器启动(比如QSPI NAND/Parallel NAND/SD/eMMC)跟从NOR FLASH启动有什么区别?
最大的区别是NAND FLASH无法像NOR FLASH那样可以XIP执行,这是由NAND FLASH原理决定的,因为NAND FLASH是按Page访问的并且允许坏块的存在,这意味着CPU无法直接从NAND FLASH取指和执行,必须先由Bootloader将存放在NAND FLASH中的Application先全部拷贝到内部SRAM中,然后从SRAM启动执行。
第三个问题:从外部SDRAM存储器启动跟从内部SRAM启动有什么区别?这里其实区别倒不大,两个都是易失性存储器,都无法直接启动,不过SRAM是直接挂在系统bus上,而SDRAM是挂在存储器接口控制器上,而后者需要Bootloader去做初始化。