一个嵌入式系统从软件角度来看分为三个层次:
- 引导加载程序
包括固化在固件(firmware)中的boot程序(可选),和BootLoader两大部分。 - Linux内核
特定于嵌入式平台的定制内核 - 文件系统
包括了系统命令和应用程序。
BootLoader概念
BootLoader 就是在操作系统运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备,从而将系统的软硬件系统带到一个合适的状态,以便为最终调用操作系统做好准备。
为什么需要进行 bootloader 移植?
- 每种不同的CPU体系结构都有不同 BootLoader。除了依赖于CPU的体系结构外,BootLoader 还依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,外设芯片的类型等。
- 这就是说,对于两块不同的开发板而言,即使它们是基于同一种CPU而搭建的,但如果它们的硬件资源或配置不一致的话,要想在一块开发板上运行的 BootLoader 程序也能在另一块板子上运行,还是需要修改。
BootLoader 的启动流程
BootLoader 的启动过程可分为单阶段(Single-Stage)和多阶段(Multi-Stage)两种,通常的 BootLoader 具有更复杂的功能,更好的可移植性。从固态存储设备上启动的 BootLoader 大多采用两阶段,即启动过程可以分为 stage1 和 stage2:stage 1完成初始化硬件,为 stage2 准备内存空间,并将 stage2 复制到内存中,设备堆栈,然后跳转到stage 2.
stage 1通常包括以下步骤:
- 硬件设备初始化
- 为加载 BootLoader 的stage 2 准备RAM空间
- 拷贝 BootLoader 的stage 2 到RAM空间
- 设置好堆栈
- 跳转到 stage 2 的 C 入口点
stage 2通常包括以下步骤:
- 初始化本阶段要使用到的硬件设备
- 将内核映像和根文件系统映像从 flash 上读到 RAM 中
- 调用内核
bootloader概述
bootloader 分为boot + loader
- boot目的:
跳转到C语言中
(1)关闭看门狗,关闭中断,关闭MMU和CACHE
(2)配置系统工作时钟
(3)配置SDRAM控制器(行地址数,列地址数,多少块,周期性的充电)
(4)让sp(栈指针)指向可读可写的设备区间中,满足递减栈的规则,SDAM —
—用哪些模式,就要初始化哪些模式下的SP
—每个模式的值不能覆盖其他模式。
(5)代码搬移:执行速度问题,把程序从存储器(nor-flash)搬移到快速的内存;
只把存储器的一部分代码执行出来,把存储在其他位置上的代码搬移到内存,对应存储器的控制器的初始化;
(6)bl main - loader目的:
执行应用逻辑,点灯,uart,load linux kernel
创建接口的开发工程
-
Makefile
1.通用Makefile,支持SD卡启动和uboot下直接运行ram
(1)程序运行时地址不同
DDR2:0x20000000
SD:0x0
(2)SD 16KB 需要加一个头信息,校验
RAM:不需要加头信息
2.变量集合
IARGET:DEP 目标:依赖
COMMAND 命令