Bootloader的作用
为什么bootloader的代码都是用汇编写的
CPU上电后会从IO空间的某地址取第一条指令。但此时:PLL没有启动,CPU工作频率为外部输入晶振频率,非常低;CPU工作模式、中断设置等不确定;存储空间的各个BANK(包括内存)都没有驱动,内存不能使用。在这种情况下必须在第一条指令处做一些初始化工作,这段初始化程序与操作系统独立分开,称之为bootloader。
一个嵌入式Bootloader最初始部分的代码几乎必须是用汇编语言写成的,因为开发板刚上电后没有准备好C程序运行环境,比如堆栈指针SP没有指到正确的位置。汇编代码应该完成最原始的硬件设备初始化,并准备好C运行环境,这样后面的功能就可以用C语言来写了。
Bootloader的作用
初始化开发板上主要硬件(时钟,内存,硬盘),把操作系统从硬盘拷贝到内存,然后让CPU跳到内存中执行操作系统。nandflash本身不能运行程序,它里面的内容必须拷贝到RAM中才能运行,但是CPU上电后,RAM中是空的,谁来执行这个拷贝的工作呢?
bootloader阶段分为boot阶段和loader阶段
boot阶段
- 关闭影响CPU正常执行的外设
看门狗,相当于定时器,特点是里面有一个基准值,还有一个递减计数器;每个时钟周 期把寄存器里面的数值减1,当减到0时有一个reset复位信号,导致芯片重启
目的:防止程序死机
我们需要关闭它的原因是:如果不关闭就经常导致重启,这样不好
- 关闭中断
- 初始化时钟
把开发板的时钟设定在最优情
- 串口驱动
- 初始化内存控制器,DDRAM
验证内存是否工作,往地址里写一个值,读出来还是那个值,说明内存可以使用,间接 证明内存可读可写。
- 初始化硬盘,nand Flash
读驱动(从nand往外读数据),需要加载硬盘驱动
loader阶段
- 从硬盘指定的地址加载Kernel到内存指定的地址
- 跳转到内存Kernel所在的地址,执行
其实bootloader主要的必须的作用只有一个:就是把操作系统映像文件拷贝到RAM中去,然后跳转到它的入口处去执行。而操作系统文件的来源,可以是flash,sd card,PC(可以通过网络,USB,甚至串口传输)等等,所谓的EBOOT,UBOOT,其实就是表明了系统文件是通过Ethernet或者USB从PC传输过去的。
bootloader是不是必须的?
bootloader并不是必须的,如果我们的硬件有足够大的norflash,并且实现了XIP技术,那么WinCE 操作系统可以直接在norflash里面运行起来,不需要将它复制到RAM中去,所以bootloader就失去了作用。
但是考虑到成本因素,现在的硬件一般都不会配置这么大的norflash,image文件都存储在nand flash里面,所以都会用到bootloader。
总结
简单说来,Bootloader就是操作系统内核运行的一段小程序,完成进行初始化系统硬件设置的任务,包括CPU、SDRRAM、Flash、串口等初始化,时钟的设置、存储器的映射。
分为启动加载模式和下载模式。
(1)启动加载(Boot laoding)模式又称为“自主”(Autonomous)模式,是指 Bootloader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。
(2)在下载模式下,目标机上的 Bootloader 将先通过串口连接或网络连接等通信手段从宿主机下载文件。