一. 前言
在经过前面漫长的裸机试验,帮助我们学习并掌握开发板上的外设的底层原理,在我们之后移植完系统后,就可以将精力放在学习Linux框架上,所以我们要将Linux系统移植到我们的开发板中去,在开始移植的Linux系统的时候我们需要先移植一个Bootloader代码,Booloader用于启动Linux系统
二. 什么是Bootloader
Bootloader是一个统称,叫做引导加载程序,指设备上电后负责有硬件初始化和操作系统加载的引导程序,并将控制权交给操作系统或应用程序,确保系统可以正常运行
1. Bootloader的基本定义
Bootloader是设备启动过程中第一个运行的软件模块,位于固件(如Flash),它的功能是加载操作系统内核或者主程序,同时完成设备所需的硬件初始化。所以Bootloader是一个通用概念,表示所有负责引导操作系统或者应用程序的程序
从手机,嵌入式,到PC都需要用到Bootloader,对于嵌入式设备中Bootloader通常存储在非易失性存储器中,例如
Flash:常见于嵌入式单片机(如STM32)。通常存储在内置Flash的前几个扇区
NOR/NAND Flash:用于存储Bootloader的前部分区域
eMMC/SD卡:在一些设备中,Bootloader存储在eMMC的引导的分区(Boot Partition)或用户分区的起始部分
2. Bootloader的作用和功能
2.1 硬件初始化
Bootloader在启动时,会根据硬件平台的特点,完成硬件初始化,首先会对CPU进行设置,例如时钟频率、以及CPU模式等。初始化必要的外设,例如内存控制器(RAM)、串口(UART)、网络控制器等。检查硬件状态,确保设备可以正常运行
2.2 加载操作系统或主程序
读取存储器(如Flash、SD卡)中的操作系统内核或主程序。将其解压缩或者加载到RAM中。跳转到内核或程序的入口地址,完成控制权的交接
2.3 启动模式选择
根据外部输入或用户配置,决定从何处加载(如网络启动、USB启动、本地存储启动)。提供安全启动选项,确保只有经过认证的系统能够运行
2.4 提供调试与维护功能
支持通过串口、网络等接口调试系统。允许烧录新的固件,支持系统升级。提供启动日志输出,帮助开发者定位问题等功能
3. Bootloader分类
3.1 按层级划分
Bootloader通常分为两级:
一级 Bootloader(Primary Bootloader):
存储在芯片的内部ROM或固定存储区。功能简单,仅负责初始化最基本的硬件环境(如 RAM、时钟),然后将控制权交给二级Bootloader
二级 Bootloader(Secondary Bootloader):
功能更强大,通常是嵌入式开发者或开源社区开发。负责更复杂的硬件初始化(如外设驱动)、加载操作系统,并提供调试功能。例如:U-boot、Barebox
3.2 按设备类型划分
1. 嵌入式设置Bootloader
例如U-boot、Barebox,常见于嵌入式Linux系统。功能丰富,支持多种外设和启动方法
2. PC系统Bootloader
例如GRUB、LILO,负责加载桌面操作系统(如Linux、Windows)
4. 为什么有不同种类的Bootloader
嵌入式设备的种类和应用场景非常多样化,从简单的单片机设备到复杂的高性能设备,格子的硬件架构和功能需求千差万别
1. 硬件架构的差异
不同设备可能使用不同的处理器架构(例如 ARM、RISC-V、x86)、每种架构的启动方式和硬件初始化流程几乎不一样
且有些设备的硬件资源非常有限(如微控制器只有几kb的Flash和RAM),无法运行功能复杂的Bootloader
2. 功能需求差异
工业控制设备可能需要实时性和更高的可靠性,简化启动流程,减少引导时间
消费电子设备可能需要图形界面和多功能支持,U-boot的生态更适合这样的场景。小型设备(如IOT芯片)只需要一个非常轻量的Bootloader,例如Barebox的精简模式,或者使用厂家定制的引导程序
5. Bootloader总结
总的说下来Bootloader是启动过程中不可或缺的组件,它将硬件和操作系统连接起来,无论是嵌入式设备、还是PC系统。Bootloader的核心作用都是,初始化硬件让硬件进入可用状态;加载系统或者应用,确保操作系统或主程序可以正常运行;提供调试与升级功能,方便开发者维护系统
三. 完整的Linux系统移植的顺序
在系统移植中移植了Bootloader后,再移植Linux的内核,移植完内核以后Linux系统是无法正常启动的,还需要移植一个根文件系统(rootfs),这三者一起构成了一个完整的Linux系统,一个可以正常使用、功能完善的Linux系统
1. Bootloader移植
前面提到Bootloader负责硬件初始化并加载Linux内核,是系统启动的第一步。我们的任务根据目标硬件平台,移植Bootloader代码,包括CPU初始化,时钟配置、内存控制器、外设初始化等。移植完成后,编译并烧录Bootloader到设备
2. Linux内核移植
内核是操作系统中的核心部分,提供硬件驱动、任务调度和资源管理。
我们需要做的就是获取适配我们硬件平台的Linux内核源码,配置内核选项(如驱动支持、文件系统支持等),并移植与目标硬件相关的驱动程序(如网卡、显示器等)。便后将内核镜像与设备树文件烧录到设,通过Bootloader引导内核启动
3. 根文件系统(rootfs)制作
根文件系统为内核提供用户空间运行环境,包含最基本的命令、库和应用程序
我们要完成的还是制作适配对应硬件的根文件系统,包含启动脚本、常用工具、库文件以及自定义应用程序。将根文件系统镜像存储在设备指定位置,并确保Bootloader能够正确传递其加载参数
4. 系统调试与优化
联合调试Bootloader、内核和根文件系统,确保系统可以从上电启动到进入用户空间,根据硬件平台和硬件需求,优化启动时间、驱动性能或文件系统布局
通过以上三步(Booloader、内核、根文件系统)的移植和调试,最终构建出一个完整、稳定的嵌入式Linux系统
四. U-Boot使用实验
前面我们说过针对于嵌入式也有很多种类的Bootloader,那么为什么对于Linux我们选择U-Boot呢?首先U-Boot支持多种启动模式(如Flash、SD卡、USB、网络等),并能加载不同的操作系统,特别适用于嵌入式设备
U-Boot本身就对Linux有深度的支持,U-Boot能高效的加载Linux内核和文件系统,支持设备树(Device Tree)和内核参数传递,方便Linux系统的启动与调试
具有强大的网络功能,支持TFTP协议远程加载固件,简化了开发调试和系统升级过程。以及高度可配置和拓展,通过环境变量、命令行接口和脚本支持,U-Boot可以根据具体需求灵活配置和定制启动流程,以上都是我们选择U-Boot的关键
那么在移植U-boot前,我们可以先使用一下U-Boot,我们直接使用正点原子移植好的U-Boot进行编译,烧写到SD卡中启动,启动U-Boot后就可以开始学习U-Boot的命令
1. U-Boot简介
uboot全称,Universal Boot Loader,是一个遵循GPL开源协议的开源软件,uboot本质就是一个裸机代码,是一个裸机的综合例程,因为前面说过了uboot需要对CPU、内存等硬件进行初始化,所以就是硬件初始化的综合实例程序
现在的uboot已经支持液晶屏、网络、USB等高级功能,这些功能的加入使得U-Boot从一个简单的逻辑引导程序发展成了一个功能强大的、具有硬件抽象和操作系统支持的引导框架
Uboot官网上的Uboot源码在此网址Index of /pub/u-boot/

这个是U-boot提供的U-boot,相当于是一个通用的框架,为不同的硬件平台提供基本支持。支持多种处理器架构和常见的开发板。但是U-boot官方的U-boot主要是面向开发者和芯片厂商,作为一个基础平台,来针对不同的硬件设施进行移植和二次开发
主要的特点就是,代码结构模块化,能够支持多个硬件平台,但未针对某个特定的芯片进行深度的优化。并且功能也比较有限,对一些硬件特性或者某些芯片支持不完善,也可能未包含厂商的特殊功能
而芯片厂商的定制版本,如(NXP 、TI、Rockchip等)会基于u-boot的官方u-boot,针对自家的芯片进行移植、优化和维护。主要目的就是让芯片在开发板或其他硬件上能更好的运行,提供全面的硬件支持和优化。也减少了开发的使用流程,只需要开发者能够快速启动和调试硬件,无需花时间去对u-boot官方的u-boot进行移植
主要特点包含,会对特定的芯片优化,厂商会在u-boot中加入针对自家芯片特定功能的支持,例如特定的外设、启动模式、时钟配置等。以及功能更全面,相比u-boot官方版本,厂商定制版本通常对自家芯片支持更完善。例如更多硬件的特性、优化启动速度、增强稳定性
GitHub - nxp-imx/uboot-imx: i.MX U-Boot这个是NXP厂商针对其自身移植的u-boot,其中有NXP维护的各个版本的uboot

据了解,这里面的u-boot基本支持了NXP当前所有支持Linux系统的芯片,而且支持各种启动方式,如EMMC、NAND、NOR FLASH等等,这些都是u-boot官方不支持的,但是我们使用的是正点原子的开发板,但是NXP是针对自家的评估板
所以正点原子就在NXP官方的uboot的基础上修改成了,适配自己的阿尔法开发板,所以这个就是第三种uboot,属于开发厂商的uboot,而NXP属于半导体厂商的uboot,所以我们这次就选择移植正点原子移植好的uboot代码,那么接下来就开始实践操作
2.U-Boot初次编译
首先在我们虚拟机中的Ubuntu中安装ncurses,否则编译的时候会报错,这个库作用很多可以自行去搜索,主要包含ncurses库是一个功能强大且灵活的文本用户界面(TUI)库,为开发者提供了丰富的函数和数据结构来创建基于文本的用户界面。通过学习和掌握ncurses的使用,开发者可以更加高效地开发各种终端应用程序
sudo apt-get install libncurses5-dev
然后自行创建一个存放uboot的目录,博主路径如下
![]()
然后下一步操作就是通过FileZilla将正点原子提供u-boot源码拷贝到对应的目录中
![]()
使用如下命令解压u-boot的压缩包

最低0.47元/天 解锁文章
1977

被折叠的 条评论
为什么被折叠?



