uboot启动流程图以及boot启动linux流程图

本文详细介绍了U-Boot在IMX6ULL芯片上的移植和启动过程,包括配置文件修改、驱动移植以及启动流程。在移植过程中,涉及到了 mx6ull_14x14_evk_emmc_defconfig 配置文件、mx6ullevk.h头文件的修改,以及板级文件夹 mx6ull_alientek_emmc 的创建。启动流程中,解释了如何从SD卡加载u-boot,再到从EMMC启动Linux内核的过程。同时,强调了Linux内核启动时的初始化步骤,如关闭MMU和D-cache。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运行厂商u-boot的前提:

运行u-boot,需要DDR或者DRAM,串口,SD卡驱动、EMMC、NAND,这些要和厂商的开发板一致,就能直接在自己板子上运行u-boot

开机流程:
当把u-boot.bin下载到SD卡上时,由于整个u-boot的起始地址为87800000,所以开始从SD卡启动IMX6ULL时,arm内核从sd卡中取指令,在DDR的87800000上运行u-boot,接着就是整个u-boot的启动流程,再通过bootcmd来自动从emmc中拷贝zImage和dtb根文件到指定地址的DDR中运行linux,bootz启动linux(其中分为从emmc启动linux,还是从网络tftp上启动linux),其中通过bootargs=console=ttymxc0,115200 root=/dev/mmcblk1p2, 来将参数告诉linux,让linux知道从imx6ull从ttymxc0串口与linux进行交互,并且设置115200波特率,且根文件系统要保存在/dev/mmcblk1p2(也就是emmc的第二个分区)。由于下载的zImage是压缩包,linux想要运行就必须先进行自解压缩,这就需要linux的第一行代码为kernel_entry(),它就是将linux进行解压的函数,在uboot的启动最后阶段会按照kernel_entry()的要求给其传入三个参数,在启动前做如下操作:

①、关闭 MMU。
②、关闭 D-cache。
③、 I-Cache 无所谓。
④、 r0=0。
⑤、 r1=machine nr(也就是机器 ID)。
⑥、 r2=atags 或者设备树(dtb)首地址。

一旦进入kernel_entry()函数,u-boot的使命结束,linux开始工作。

linux启动所做的工作:

1、确保CPU处于SVC模式且关闭所有中断,检查是否支持该CPU,验证设备树是否存在,使能MMU,调用 start_kernel 来启动 Linux 内核。(linux内核的第一阶段,接下来进入C语言)

2、未完待续。。。。

u-boot移植流程:(几个移植的重要文件)

mx6ull_14x14_evk_emmc_defconfig(添加开发板默认配置文件

uboot的configs 目录下有很多配置文件,可想而知,每一个配置文件就对应一块开发板。
我们找到 mx6ull_14x14_evk_emmc_defconfig, 这是nxp官方的配置文件,我们就是参考它做修改。

CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_my_emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_MX6ULL_MY_EMMC=y
CONFIG_CMD_GPIO=y

mx6ullevk.h(添加自己开发板的头文件)

在include/configs 下拷贝mx6ullevk.h 并修改。

在这个头文件中有许多宏定义,这些宏基本用于配置uboot,也有一些I.MX6ULL 的配置项目。
如果我们想要禁用uboot的某些功能,在这个头文件中修改即可。

mx6ullevk.h 文件中基本都是“CONFIG_”开头的宏定义,这也说明 mx6ull_alientek_emmc.h 文件的主要功能就是配置或者裁剪 uboot如果需要某个功能的话就在里面添加这个功能对应的 CONFIG_XXX 宏即可,如果不需要某个功能的话就删除掉对应的宏即可。(在具体u-boot的启动流程中,会有ifdefine CONFIG_XXX ,则运行下面的代码,如果你没有定义或者删除改宏定义,则下面的代码就不会运行,相当与对u-boot进行了裁剪)

mx6ullevk.h 中包含了 mx6_common.h,如果没有在mx6ullevk.h中发现某个功能或命令,但uboot中又确实存在,可以去mx6_common.h 中寻找。


mx6ull_alientek_emmc(添加开发板对应的板级文件夹)

uboot中每一块板子都拥有一个板级文件夹,用来存放板级文件。比如开发板上的外设驱动文件等。

NXP 的 I.MX 系列芯片的所有板级文件夹都存放在 board/freescale 目录下,imx6ull 对应的板级文件夹是mx6ullevk。同样备份重命名。

进 入 mx6ull_alientek_emmc 目 录 中 , 将 其 中 的 mx6ullevk.c 文 件 重 命 名 为mx6ull_alientek_emmc.c

1、修改板级文件夹目录下的 Makefile 文件

将文件名修改为刚刚改的文件,这样才会编译mx6ull_my_emmc.c这个文件。

2、修改 imximage.cfg 文件

PLUGIN 这一项路径改成我们自己文件夹的路径。

3、修改 Kconfig 文件

4、修改 MAINTAINERS 文件

5、修改 U-Boot 图形界面配置文件

uboot 是支持图形界面配置

LCD 驱动修改

一般 uboot 中修改驱动基本都是在 xxx.h 和 xxx.c 这两个文件中进行的, xxx 为板子名称,比如 mx6ull_alientek_emmc.h 和 mx6ull_alientek_emmc.c 这两个文件。

一般修改 LCD 驱动重点注意以下几点:
①、 LCD 所使用的 GPIO,查看 uboot 中 LCD 的 IO 配置是否正确。
②、 LCD 背光引脚 GPIO 的配置。
③、 LCD 配置参数是否正确。

总结
①、不管是购买的开发板还是自己做的开发板,基本都是参考半导体厂商的 dmeo 板,而半导体厂商会在他们自己的开发板上移植好 uboot、linux kernel 和 rootfs 等,最终制作好 BSP包提供给用户。
我们可以在官方提供的 BSP 包的基础上添加我们的板子,也就是俗称的移植。
②、我们购买的开发板或者自己做的板子一般都不会原封不动的照抄半导体厂商的 demo板,都会根据实际的情况来做修改,既然有修改就必然涉及到 uboot 下驱动的移植。
③、一般 uboot 中需要解决串口、NAND、EMMC 或 SD 卡、网络和 LCD 驱动,因为 uboot的主要目的就是启动 Linux 内核,所以不需要考虑太多的外设驱动。
④、在 uboot 中添加自己的板子信息,根据自己板子的实际情况来修改 uboot 中的驱动。
 

u-boot启动流程 

<think>好的,我现在需要回答用户关于“uboot启动流程图”的问题。首先,我要回想一下自己对uboot启动流程的理解,确保信息准确。uboot是嵌入式系统中常用的引导加载程序,负责初始化硬件并加载操作系统。它的启动流程分为几个阶段,但具体步骤可能会因架构而异,比如ARM和PowerPC可能有所不同。 用户可能希望了解uboot启动的主要步骤,以及每个阶段的关键操作。我需要先概述整体流程,然后分阶段详细说明。可能需要提到BL1、BL2这些阶段,特别是对于ARM架构,比如从ROM代码开始,然后加载SPL,再加载完整的uboot。需要注意不同芯片厂商可能有不同的初始化步骤,比如三星的Exynos和TI的OMAP处理器可能流程不同。 需要确认是否要包括具体的代码执行流程,比如汇编阶段到C语言阶段的过渡,或者关键的函数调用如lowlevel_init、board_init_f等。此外,内存初始化、时钟配置、外设初始化和环境变量加载都是重要部分。最后,uboot如何加载内核镜像,比如通过bootcmd环境变量启动。 可能存在的疑问是,是否需要区分不同架构的处理流程,或者是否要提到具体的代码文件,比如start.S、board.c等。另外,是否需要图示说明,但用户只是要求介绍,可能用文字描述各阶段即可。需要确保术语准确,比如SPL(Secondary Program Loader)的作用,重定位的过程等。 还要注意避免过于技术化的细节,保持解释清晰易懂,适合不同层次的读者。可能需要先定义uboot的基本作用,再逐步展开启动流程。最后,检查是否有遗漏的关键步骤,比如设备树(DTB)的加载,这在现代uboot中很重要。确保回答结构合理,逻辑连贯,帮助用户形成完整的流程图理解。</think>U-Boot(Universal Boot Loader)是嵌入式系统中最常用的引导程序之一,其启动流程可分为多个阶段。以下是基于ARM架构的典型U-Boot启动流程图解(文字描述): --- ### 一、芯片上电阶段 1. **ROM Code执行** - 芯片内部固化ROM代码首先运行,初始化基础硬件(时钟、内存控制器) - 从预定义存储设备(如eMMC、SD卡)加载SPL(Secondary Program Loader) --- ### 二、SPL阶段(二级加载器) ```c /* 典型执行路径:arch/arm/cpu/armv7/start.S */ 1. _start: 设置异常向量表 2. reset: 关闭中断,进入SVC模式 3. cpu_init_cp15: 初始化CP15协处理器(MMU/Cache控制) 4. lowlevel_init: 关键硬件初始化(内存、GPIO、时钟) 5. _main: 设置临时栈,跳转到C语言阶段 ``` - 初始化DDR内存控制器 - 加载完整U-Boot到内存 - 验证U-Boot镜像完整性 --- ### 三、U-Boot主体阶段 ```c /* 主要执行流程:common/board_f.c / board_r.c */ 1. board_init_f(): 前期初始化 - 设置全局变量(gd结构体) - 串口初始化(输出"U-Boot"启动信息) - 内存布局规划(代码重定位准备) 2. 重定位操作 - 将U-Boot自身代码从加载地址复制到链接地址 - 修复重定位后的地址偏移 3. board_init_r(): 后期初始化 - 外设初始化(网卡、USB、存储设备) - 环境变量加载(env_relocate()) - 设备树(DTB)解析 - 命令行接口准备 ``` --- ### 四、启动加载阶段 1. **执行bootcmd** - 读取环境变量`bootcmd`定义的启动命令 - 典型流程: ``` => fatload mmc 0:1 ${kernel_addr_r} zImage # 加载内核 => fatload mmc 0:1 ${fdt_addr_r} dtb.img # 加载设备树 => bootz ${kernel_addr_r} - ${fdt_addr_r} # 启动Linux内核 ``` 2. **移交控制权** - 通过`bootm`或`bootz`命令跳转到内核入口地址 - 传递启动参数(ATAGS或Device Tree) --- ### 五、流程图关键节点 ``` ROM Code → SPL → U-Boot → Kernel │ │ │ ├→ 基础硬件初始化 │ ├→ 内存初始化 → 重定位 → 外设初始化 └→ 存储设备访问 → 环境变量 → 启动命令 ``` --- ### 六、特殊场景处理 1. **安全启动**:验证镜像签名(如启用FIT Image) 2. **快速启动**:跳过冗余初始化(使用`CONFIG_SKIP_LOWLEVEL_INIT`) 3. **恢复模式**:检测特定按键进入紧急下载模式 建议结合具体芯片手册分析启动流程,不同处理器(如i.MX6/STM32/RK3399)的初始化细节会有差异。可通过`CONFIG_DEBUG_U_BOOT`开启调试输出观察详细启动过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值