BootLoader的定义
BootLoader是一段上电时便开始执行的代码,主要完成初始化硬件设备、准备好软件环境以及调用操作系统内核等任务。
BootLoader的操作模式
1、启动加载
一般用于产品发布时,上电后BootLoader便从板子上的某个固态存储设备上将操作系统加载到RAM中执行
2、下载模式
开发人员可通过串口或网络连接等手段从主机下载文件,使用命令将其放在内存运行或是烧入Flash类固态存储设备中
嵌入式Linux系统的四个基本层次
1、引导加载程序
—— 固化程序(boot代码),例如BIOS
—— BootLoader程序
2、Linux内核
嵌入式板子的定制内核
3、文件系统
—— 根文件系统(一般包含一些系统应用程序、库等)
—— 建立于Flash内存设备上的文件系统
4、用户应用程序
BootLoader的两个阶段
1、第一阶段一般采用汇编语言实现,主要功能如下
- 硬件设备初始化(eg:关闭看门狗、关中断、设置CPU时钟速率等)
- 准备RAM空间加载第二阶段的代码
- 将第二阶段代码复制到RAM中
- 设置好栈
- 跳转到第二阶段代码的入口点
2、第二阶段一般采用C语言实现,实现功能有
- 初始化本阶段需要使用的硬件设备
- 检测系统内存映射
- 将内核映像和根文件系统映像从Flash读到RAM空间中
- 为内核设置好启动参数
- 调用内核
BootLoader与内核之间的交互
由于同一时间内两者之间只能有一个在运行,所以两者之间的交互是单向的,一般是BootLoader将参数放在某个约定的地方,再启动内核,内核则从该处获得参数。
内核参数数据结构采用标记列表实现
U-Boot介绍
U-Boot,通用BootLoader(Universal Boot Loader),可引导多种操作系统,支持多种架构的CPU,且开源免费,有较高的可靠性和稳定性
U-Boot源码主要分为四类
—— 平台、开发板相关,board、CPU
—— 通用的函数,include、lib_generic、common
—— 通用的设备驱动程序,disk、drivers、dtt、fs......
—— U-Boot工具、示例程序、文档,doc、examples、tools
如何使用U-Boot
1、U-Boot的配置
阅读U-Boot的顶层readme文件,了解其配置过程
—— 首先选择处理器架构和开发板的类型
$cd u-boot
$make smdk2410
在这一命令的作用下,会生成一个config,mk文件,存放于/include目录下,打开该文件,其内容如下
ARCH = arm
CPU = arm920t
BOARD = smdk2410
VENDOR = samsung
SOC = s3c24x0
由此可知,make smdk2410即指明了我们需要配置的体系结构、CPU、开发板等
—— 编译U-Boot
$make all
查看顶层Makefile文件其中与ARM相关的部分,其中有
include $(OBJTREE)/include/config.mk(这个就是上一步中生成的config.mk文件)
include $(TOPDIR)/config.mk(这是顶层的config.mk文件)
查看顶层的config.mk文件,其部分内容如下,由此可知该文件根据之前设置的几个变量的值来确定编译器、编译选项等
# Check if arch/$ARCH/cpu/$CPU exists, otherwise assume arch/$ARCH/cpu contains
# CPU-specific code.
CPUDIR=arch/$(ARCH)/cpu/$(CPU)
ifneq ($(SRCTREE)/$(CPUDIR),$(wildcard $(SRCTREE)/$(CPUDIR)))
CPUDIR=arch/$(ARCH)/cpu
endif
sinclude $(TOPDIR)/arch/$(ARCH)/config.mk # include architecture dependend rules
sinclude $(TOPDIR)/$(CPUDIR)/config.mk # include CPU specific rules
ifdef SOC
sinclude $(TOPDIR)/$(CPUDIR)/$(SOC)/config.mk # include SoC specific rules
endif
ifdef VENDOR
BOARDDIR = $(VENDOR)/$(BOARD)
else
BOARDDIR = $(BOARD)
endif
ifdef BOARD
sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rules
endif
U-Boot的编译流程
1、编译cpu/$(CPU)/start.S
2、对于平台/开发板相关的每个目录,每个通用目录都使用它们各自的Make file生成的库
3、将前面生成的.o,.a文件按照board/$(BOARDDIR)/config.mk文件指定的代码段地址、board/$(BOARDDIR)/U-Boot.lds连接脚本进行连接
4、将得到的ELF格式的U-Boot转换为二进制格式