逸珺 · 2020年04月07日

U-Boot架构浅析

导读:嵌入式Linux系统搭建,bootloader是必不可少的一环,而U-Boot已成嵌入式Linux事实标准。所以较为深入的分析U-Boot的设计,对于更好的理解U-Boot的工作原理有着重要意义。

  1. U-Boot简介

Das U-Boot 是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,包括PPC、ARM、AVR32、MIPS、x86、68k、Nios与MicroBlaze。这也是一套在GNU通用公共许可证之下发布的自由软件。<百度百科>
http://www.denx.de/wiki/U-Boot
如其官网上所述,具有十大黄金法则:小巧、快速、简单、可移植、可配置、可调试、易用、可维护、优雅、开源。
(1. Keep it Small,2. Keep it Fast,3. Keep it Simple,4. Keep it Portable;5. Keep it Configurable;6. Keep it Debuggable;7. Keep it Usable;8. Keep it Maintainable;9. Keep it Beautiful;10. Keep it Open)

所以本文试图从其设计的角度进行分析这些黄金法则,以期自己在软件工程思想的角度能有所获,同时也将自己笔记分享(Keep it open),方便与人交流,以期获得更为深入的理解与体悟。

废话说了蛮多,Let's go:

  1. U-Boot文件夹拓扑结构

基于u-boot-u-boot-2016.09.y的文件夹结构如下:
folder.png

  • arch 体系架构依赖
  • api 机器架构独立API,外部调用接口

    • 实现I/O,如标准化输入输出,显示,网络API、存储API等,为cmd提供支持
  • board 板级依赖实现。
  • cmd shell命令实现
  • common 与架构无关的杂项独立功能
  • configs 板级配置文件
  • disk 磁盘分区实现
  • doc 文档
  • drivers 通用设备驱动程序
  • examples 应用示例代码
  • fs 文件系统实现(cramfs,ext2,jffs等)
  • include 头文件
  • lib 通用库
  • license
  • net 网络通讯实现
  • post 上电自检是实现
  • scripts 构建脚本以及Makefile
  • tests 各种单元测试
  • tools 生成S-Record或U-Boot映像的工具等.
  1. 项目管理

U-Boot采用Kconfig进行项目管理,实现可裁剪可配置,新版U-Boot已支持make menuconfig功能,实现了易用的设计目标。其配置界面与内核一样。
image.png

  1. 模块层次架构分析

uboots.jpg

  • arch 实现了不同体系结构的CPU,指令集、设备树底层抽象,利用链接绑定实现了符号入口相对位置保持不变,故才能实现将内核镜像拷贝到内存然后进行引导的功能。lib实现了初始化C运行时环境(栈/堆指针等的初始化),dts实现了设备树的底层体系架构依赖的具体抽象剥离。
  • machine ,由于同样的内核相同,各家芯片外设都不尽相同,所以将各自个性实现剥离实现于此,这主要体系在ARM体系的芯片,由于ARM公司售卖IP,各家芯片厂商在内核的基础上延伸出各自不同的芯片,所以需要将差异性剥离实现。
  • board, 实现了产业链下游,设备厂商的差异性,对于产品设计而言,需要将各自在boot阶段需要严格初始化的实现放在这里,比如IO口的初始化,产品中大部分IO口必须显式设置其初始状态。
  • driver 这里实现了boot阶段必要的设备驱动,如网口、显示等。
  • dts 实现了设备树
  • api 实现了基本的IO,如标准化输入输出,显示,网络API、存储API等,为cmd提供支持。
  • disk 实现了轻量级磁盘管理
  • fs 文件系统实现(cramfs,ext2,jffs等)
  • lib 通用库,比如CRC算法,加密算法,压缩算法,字符串操作等
  • cmd 实现了U-Boot命令集。
  • net 实现网络协议层
  • cmd shell命令集,调用下层实现用户接口功能,如下载,引导,存储环境变量,打印信息等。
  • common 是U-Boot 主体,如系统停留在U-Boot阶段,CPU始终在执行一个死循环,run_main_loop().

5.基于armv8无SPL的启动流程分析

5.1 汇编程序执行阶段
start.jpg
5.2 C执行阶段
board_init_r的调用,进入C执行阶段,如下:
init.png
至此,粗浅的将U-Boot的架构设计分析了一下。还有很多设计细节有待深挖。文中仅代表个人理解观点,错误在所难免,欢迎交流。

文章出自微信公众号:嵌入式客栈,更多内容,欢迎关注交流

win.png

推荐阅读
关注数
2831
内容数
162
分享一些在嵌入式应用开发方面的浅见,广交朋友
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息