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

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

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值