1. BootLoader
The computer first executes a relatively small program stored in read-only memory (ROM) along with a small amount of needed data, to access the nonvolatile device or devices from which the operating system programs and data can be loaded into RAM.
2. U-Boot
Das U-Boot – the Universal Boot Loader
其官网地址为:http://www.denx.de/wiki/U-Boot/WebHome
官网也很贴心的有指导手册
U-Boot是遵循GPL条款的开放源码项目。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。U-Boot不仅仅支持嵌入式Linux系统的引导,它还支持NetBS
D, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android嵌入式操作系统。它还具有丰富的驱动代码及文件系统支持。(UART、Ethernet、SDRAM、Flash,RTC,ext[2|3|4]、FAT,JFFS2、Squashfs、Cramfs、UBIFS等)
U-Boot的主要作用是:
- 初始化硬件
- 建立内存空间映射
2.1. Bootup Stages
BootLoader的启动过程可以使单阶段(single stage)与多阶段(multi-stage)
一般选择多阶段启动提供更复杂的功能,以及更好的可移植性。
2.1.1. Stage1
常用汇编代码编写此段代码。例如u-boot/arch/arm/xxx/start.S
。
Stage1 的主要作用:
- 设定异常向量(exception vector)
- 初始化硬件(CPU速度,时钟频率,关中断,Disable I/D Cache,u-boot毕竟很简单)
- 初始化内存控制器
- 拷贝Rom或者Flash 等上的程序到Ram中(u-boot运行代码)
- 初始化堆栈
2.1.2. Stage2
主要是C语言代码,ARM体系一般是在lib_arm/board.c中start_armboot()。Stage2 主要完成:
- 该阶段使用到的外围硬件初始化(Flash、SD、Ethernet等)
- 检测RAM 映射
- 拷贝Kernel 镜像至RAM 中的加载地址
- 设定启动参数
- 启动OS
2.2. U-Boot Directory
目录 | 特性 | 备注 |
---|---|---|
board | 平台依赖 | 目标板文件。Flash,Ram等驱动 |
cpu | 平台依赖 | 与处理器相关 |
lib_arm | 平台依赖 | 处理器体系相关 |
post | 通用 | 上电自检文件目录 |
fs | 通用 | 文件系统fat,jffs2,nfs,ubifs,ext[2-4]等 |
driver | 通用 | 通用设备驱动 |
net | 通用 | 网络 |
common | 通用 | 内存检测,Nand等常用命令 |
2.3. U-Boot Memory Map
U-Boot 的内存主要分布图如下图:
2.4. U-Boot Parameters
名称 | 默认值 | 备注 |
---|---|---|
bootargs | noinitrd root=/dev/mtdblock4 init=/linuxrc console=ttySAC0,115200 | U-Boot 在启动内核之前的等待时间,单位:秒 |
bootdelay | 1 | 与处理器相关 |
ethaddr | 00:40:5C:26:0A:5B | 网卡的MAC 地址 |
ipaddr | 172.20.223.235 | U-Boot 使用的IP 地址 |
loadaddr | 0x40000000 | 下载二进制文件时的默认地址 |
bootcmd | nand read C0008000 600000 500000; bootm C0008000 | 当使用boot 命令启动系统时所执行的脚本 |
Parameters Store
globa data的RAM地址一般是存放在ARM 的R8
通用寄存器中。定义见include/asm-generial/global_data.h
。
注:具体的位置可能因为U-Boot 代码的维护更新在变动,具体请参考实际的GitHub 版本
1 |
|
1 | typedef struct global_data { |
bd_t 保存于板子相关的配置参数。具体可见include/asm-generial/u-boot.h
。
1 | typedef struct bd_info { |
在启动之后一般使用RAM 临时存放启动参数,在使用saveenv
命令后将会将之写到类似于Flash 存储介质上。
Parameters Structure
ARM 采用了自己体系定义的参数结构。它的定义可以参见arch/arm/include/asm/setup.h
。
1 | struct tag { |
U-Boot就是将各种启动参数串联成类似下图结构给OS。
注:必须以ATAG_CORE, ATAG_NONE开头与结尾,Kernel启动时会依据此检测参数的有效性。
2.5. Bootup OS
以ARM 体系启动Kernel需满足以下几点:
- R0=0, R1=[机器码], R2=[Kernel启动参数起始地址]
- Disable I/D Cache
- Disable IRQ,FIQ
- CPU in SVC 模式
注:SVC 模式为Supervisor Control 模式,操作系统使用的保护模式,此模式下CPU能访问的数据权限更大,局限小。
Setting
Parameters