嵌入式Linux学习(四)了解BootLoader

2019-07-13 00:44发布

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转换为二进制格式