uboot研读笔记 | 00 - 嵌入式Linux系统中Bootloader的作用和基本运行原理

1. 嵌入式Linux系统开发架构

一个嵌入式Linux的系统的架构如下图:

软件程序开发中,从下往上每一次的作用依次为:

  • Bootloader:将硬件初始化,并将内核引导起来;
  • Linux Kernel:定制、裁剪之后的Linux内核;
  • 根文件系统:提供文件系统,更好的使用存储空间;
  • 设备驱动:完成设备操作,并向上层软件提供设备的调用接口;
  • 应用程序:Linux系统编程、网络编程、shell编程、图形界面编程等等;

2. Bootloader的作用

Bootloader在上图中处于最底层,有以下两个作用:

  • Bootloader和硬件息息相关:直接和CPU、外围硬件设备(存储器、网卡、LCD等)打交道,负责初始化硬件设备
  • Bootloader负责拉起内核:建立内存空间映射图,为内核的启动运行做好一切准备,最后将Linux内核代码加载到RAM中运行;

3. Bootloader的操作模式

一般来说,bootload都会提供两种操作模式:

  • 正常启动模式:无需开发者和用户干涉,上电后自动开始运行,完成启动内核的任务;
  • 下载模式(开发者模式):需要用户干预,进入下载模式,使用uboot命令进行操作;

4. Bootloader运行基本原理

BootLoader程序是分级载入机制,通常分为 stage1 和 stage2 两大部分。

Stage1

BootLoader 的 stage1 依赖于CPU体系结构的代码,例如CPU相关初始化代码等, 通常都用汇编语言来实现,达到高效操作的目的。

stage1 包括以下步骤:

  • 硬件设备初始化
    • 屏蔽所有的中断
    • 设置CPU的速度和时钟频率
    • 设置内存控制器
    • 关闭 CPU 内部指令/数据 cache
  • 为加载 stage2 准备 RAM 空间
  • 拷贝 stage2 到 RAM 空间中
  • 设置好堆栈指针sp,为执行 C 语言代码作好准备
  • 跳转到 stage2 阶段的C程序入口处;

Stage2

BootLoader 的 stage2 通常用C语言来实现,可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。

stage2 包括以下步骤:

  • 初始化本阶段要使用到的硬件设备
    • 串口设备:以便输出信息
    • ……
  • 检测系统内存映射(memory map):准备识别在整个 4GB 物理地址空间中有哪些地址范围被分配用来寻址系统的 RAM单元;
  • ③将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中;
  • 为内核设置启动参数
  • 调用内核:跳至内核代码入口开始执行;

5. 常用Bootloader

目前常用的Bootloader中,uboot是主流使用的,本系列文章着重讲述uboot的源码和移植。

uboot

U-Boot是由开源项目PPCBoot发展起来的,ARMboot并入了PPCBoot,和其他一些arch的Loader合称U-Boot,2002年12月17日第一个版本U-Boot-0.2.0发布,同时PPCBoot和ARMboot停止维护,但是截至目前,uboot一直在不断的更新中。

uboot的特色是“u”- universal(通用的):

  • 处理器层面:支持PowerPC系列的处理器,支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列;
  • 内核层面:除了Linux之外,还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS,LynxOS, android嵌入式操作系统等;
  • 设备驱动层面:支持串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等常用硬件设备;

这些丰富的支持依赖于uboot的源码开源,开源许可协议遵循GNU通用公共许可证。

其它

除了uboot之外,还有一些不常用的bootloader,在此作以介绍:

  • Redboot:Redboot是Redhat公司随eCos发布的一个bootloader方案,也是一个开源项目;
  • Blob(Boot Loader Object):由Jan-Derk Bakker and Erik Mouw发布,功能比较齐全,代码较少,比较适合做修改移植,用来引导Liunx,目前大部分S3C44B0板都用Blob修改移植后来加载uClinux;
  • vivi:vivi是韩国mizi 公司开发的bootloader, 适用于ARM9处理器。

接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』

发布了216 篇原创文章 · 获赞 575 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/Mculover666/article/details/104396179
00