手把手完成IMX6ULL系统移植实验,包含各种问题的处理(一)

 一. 前言

        在经过前面漫长的裸机试验,帮助我们学习并掌握开发板上的外设的底层原理,在我们之后移植完系统后,就可以将精力放在学习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的压缩包


                
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值