U-Boot(Universal Boot Loader),即通用Bootloader,是德国DENX小组开发的用于多种嵌入式CPU的bootloader程序。是遵循GPL条款的开放源代码项目。
Bootloader不属于操作系统内核,这一部分代码不具有可移植性,在移植操作系统时,这部分代码必须加以改写:Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。
U-boot启动的最终目的:启动内核
两种情况:1.从XIP设备(Flash)XIP代表"Execute In Place",它是一种技术,允许嵌入式系统直接在非易失性存储器(如闪存)中执行程序,而无需将程序复制到随机存取存储器(RAM)中。
2.非XIP设备:将U-Boot指令赋值进内存里面。
- 初始化内存
- CPU从Flash(闪存芯片)中读内核或者通过EMMC控制器,将内核拷贝到RAM(内存)。
- 初始化硬件(比如时钟等)
一、U-boot 源码目录结构
u-boot-2010.06及以后版本,基本目录结构如下表
Name | Description |
api | 此目录下存放u-boot向外提供的接口函数 |
arch | 与体系结构相关的代码,核心文件夹。s5p4418是arm体系结构。 |
board | 此文件夹是根据不同的具体开发板而定制的代码,代码也不少 |
common | 通用代码,涵盖各个方面,以命令行处理为主 |
disk | 磁盘分区相关代码 |
doc | 常见功能和问题的说明文档,一堆README开头的文件 |
drivers | 常用的设备驱动程序,每个类型的设备驱动占用一个子目录 |
examples | 示例程序 |
fs | 文件系统,支持嵌入式开发常见的fs(cramfs,ext2,ext3,jffs2,etc) |
include | 全局需要的头文件定义在这儿 |
lib | 通用库文件 |
net | 网络相关的代码,小型的协议栈 |
post | Power On Self Test,上电自检 |
Tools | 辅助程序,用于编译和检查uboot目标文件 |
目录详细解释参考:U-Boot目录详细解释 U-Boot目录分析
一、阶段一:硬件设备的初始化
1.关闭MMU( Memory Management Unit,内存管理单元)
暂停操作系统或内核:在关闭 MMU 之前,通常需要停止操作系统或内核的正常运行,以免发生意外。
设置页表:在关闭 MMU 之前,通常需要设置一个简单的页表或地址映射表,将物理地址映射到逻辑地址。
关闭 MMU:针对特定的处理器架构和硬件平台,相应的指令可能会被用来关闭 MMU。例如,在 ARM 架构中,可以使用相应的寄存器设置指令来关闭 MMU。
禁用缓存:在关闭 MMU 后,也通常需要禁用缓存以确保内存访问的一致性。
初始化硬件设备:一旦 MMU 关闭,可以进行硬件设备的初始化操作,这可能涉及对不同设备寄存器的配置、初始化硬件中断、设置时钟等。
2.禁用CACHE(缓存)
禁用缓存:在某些处理器架构中,通过设置相应的寄存器或配置位来禁用缓存功能。对于不同的处理器架构可能会有不同的寄存器或指令来实现。
刷新缓存:在关闭缓存之前,通常需要确保缓存中的数据被刷新到内存。这是为了避免数据丢失或不一致性的问题。
关闭缓存一致性:某些处理器可能有缓存一致性相关的机制,需要根据需求关闭这些机制以确保适当的操作顺序。
确认关闭:在执行完关闭缓存的操作后,需要进行验证以确保缓存被正确禁用。
3.设置系统时钟比例、关闭看门狗
4.初始化外部存储器KSDRAM
确保硬件连接正确:首先确保外部存储器正确连接到系统中,并且所有必要的引脚和信号线都连接正确。
配置引脚复用:如果外部存储器控制器的引脚具有多个功能(复用功能),需设置正确的引脚复用以将控制器与外部存储器连接。
配置存储器控制器:根据外部存储器的规格和要求,配置存储器控制器。这可能涉及时序设置、数据宽度、频率设置等。
初始化存储器:在存储器控制器配置完成后,需要执行存储器的初始化序列,这可能包括发送特定的命令序列或设置存储器控制器的寄存器来初始化外部存储器。
进行校验:进行初始化后,通常需要进行一些校验操作来确保外部存储器初始化成功,存储器可以正确访问和读写。
测试稳定性:最后,进行一些读写测试以确保外部存储器的稳定性和可靠性。这些测试可帮助发现潜在的问题或错误。
- 为加载u-boot的第二阶段代码准备RAM空间
- 复制u-boot的第二阶段代码到RAM空间中:
- 设置好栈;
- 跳转到第二阶段代码的C入口点。
二、阶段二
-
初始化本阶段要使用的硬件设备
-
检测系统内存映射:
-
将内核映像和根文件系统映象从Flash上读到RAM空间中;
-
为内核设置启动参数;
-
调用内核。