bootloader技术小结

Posted by LuckXiang on February 28, 2019

学习一段知识并用学到的知识来解决问题很容易,但是要把这段知识传授给别人或者说讲给别人听,还需要经过自己的归纳总结,形成一个知识体系才行。不然就是一看代码都知道, 面试官一问却说得不够全面,下边我将从bootloader开始,结合以前的工作经历来一步一步完善自己的知识图谱。

0x00 什么是bootloader

一个带操作系统的嵌入式应用从软件的角度来看,可以分为4个层次:

    1. 引导加载程序,包括boot固件(非必须)和bootloader两部分
    1. 操作系统内核
    1. 文件系统
    1. 用户应用程序

因此,boot固件或者bootloader是系统上电以后运行的第一段代码,它主要是初始化硬件,建立内存空间映射表,准备好软硬件环境,最终完成调用操作系统内核的使命。 booloader是基于特定的硬件平台实现的,它主要依赖于CPU体系结构和嵌入式板级配置,所以它的软件实现一般也就分成两部分,stage1和stage2。

0x01 stage1

第一段启动代码是和CPU体系相关的,一般由汇编代码构成,也可能包含一部分C代码,从而达到短小精悍又易于维护。一般来说,stage1要完成以下几个步骤:

  • 1.硬件设备初始化
  • 2.为加载 Boot Loader 的 stage2 准备 RAM 空间
  • 3.拷贝 Boot Loader 的 stage2 到 RAM 空间中
  • 4.设置好堆栈
  • 5.跳转到 stage2 的 C 入口点

在gxloader中,它实现为以下几步:

    1. 配置中断向量表
    1. 关闭MMU和caches
    1. 屏蔽所有中断
  • 4.设置sram的栈基地址
  • 5.设置堆栈指针sp,跳转到c函数
  • 6.配置CPU频率和部分模块的时钟以及USB等设备的初始化
  • 7.配置MMU和caches
  • 8.配置dram的栈基地址
  • 9.拷贝flash中的stage2代码到dram,跳转到stage2

0x02 stage2

stage2主要和板级配置有关,初始化硬件,建立内存映射表,拷贝内核到dram中,配置内核启动参数等,此外还有一些开发者添加的功能,如logo显示,软件升级。它的核心步骤如下:

  • 1.初始化本阶段要使用到的硬件设备
  • 2.检测系统内存映射(memory map)
  • 3.将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中
  • 4.为内核设置启动参数
  • 5.调用内核

在gxloader中,它的核心步骤实现为以下几步:

  • 1.配置堆空间
  • 2.板级初始化
  • 3.配置各模块时钟
  • 4.驱动初始化
  • 5.分区初始化
  • 6.设置内核参数
  • 7.加载内核并跳转

stage2可以做很多工作,但是我认为其中有两个部分需要认真理解:内存布局和内核的启动参数
搞清楚内存布局需要注意基地址和映像的大小两个方面,在flash操作和内存拷贝,了解内存布局才知道我们在做什么。
linux内核启动前需要配置启动参数,根据内存布局,我们把启动参数放到内存的某个位置,在加载内核的时候通过寄存器把它的地址传给内核,然后内核进行解析处理。 启动参数有很多,其中最主要的是串口终端,init,根文件系统的配置。

0x03 bootloader的C库问题

一般来说bootloader不会链接完整的libc库,但是我们可以把常用的字符串操作,内存操作,printf相关的模块移植过来,方便程序的维护开发

0x04 stage1和stage2的链接问题

stage1和stage2通过lds链接脚本来整合成一个bin文件,链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局

0x05 我做过的loader维护工作

  • 1.loader最常见的维护工作就是板级配置,这部分的工作都集中在config文件中,各种IO复用,芯片选择,模块设置等,每一次出新的硬件都得修改这部分的文件
  • 2.高级安全,高级安全需要的各个组件平台都有基本的实现,但是客户的loader是独立维护而且key需要在服务器上集中管理,我需要去修改makefile,源码, 编写一些配置脚本来搭建客户需要的高安loader环境,此外,由于高安刚出来的时候只有我们的API客户使用nandflash,我还需要对平台的方案进行修改以适配nandflash
  • 3.定期跟踪平台的补丁,把客户需要的一些功能合并到他们的版本上去
  • 4.配合硬件或者芯片工程师,调试一些芯片级的客户问题,如HDMI输出异常,USB不稳定等问题