【移植04】u-boot(Bootloader的后两个阶段)、设备树文件(dtb)、内核镜像(zImage)、根文件系统从烧写存储到eMMC中到完整加载运行的过程与原理详解

目录

本篇博文我们要实现什么?

在前面的两篇博文中我们只是把移植修改生成的内核、设备树、根文件通过网络进行的加载,也就是并没有把它们写入到eMMC存储器,当最终修改测试没问题,显然我们应该是把这些东西烧写到eMMC存储器中的。

所以本博文的目标很明确:就是要把我们在前面两篇博文移植修改相关源码生成的u-boot、内核、设备树、根文件写到eMMC存储器中,从而实现从eMMC存储器启动一个完整并且能正常运行的Linux系统。

前面两篇博文是指下面这篇博文:
https://blog.youkuaiyun.com/wenhao_ir/article/details/145662136
https://blog.youkuaiyun.com/wenhao_ir/article/details/145822475

读本篇博文所需要的先行知识

关于芯片内部的ROM的作用、工作原理的介绍,链接如下:
https://blog.youkuaiyun.com/wenhao_ir/article/details/145969584

eMMC存储器详解(存储区域结构、EXT_CSD[179]、各分区介绍、主要引脚、命令格式与类型等)
https://blog.youkuaiyun.com/wenhao_ir/article/details/145967306

IMX6ULL运行Linux系统的Bootloader的三个阶段详解(BootROM、SPL、U-Boot)(SPL和U-Boot合成镜像u-boot-dtb.imx时需要作填充数据处理)
https://blog.youkuaiyun.com/wenhao_ir/article/details/145999721

百问网(100ask)提供的烧写工具的原理和详解;将自己编译生成的u-boot镜像文件烧写到eMMC中
https://blog.youkuaiyun.com/wenhao_ir/article/details/145653414

运行于u-boot中的Fastboot(FB)协议介绍(快速烧写 eMMC、NAND、UFS 等存储设备的协议)
https://blog.youkuaiyun.com/wenhao_ir/article/details/145985144

u-boot中与eMMC/SD卡相关的功能模块“MMC sub system”的详细介绍
https://blog.youkuaiyun.com/wenhao_ir/article/details/146016551

整个Bootloader的流程详解

如果要了解整个Linux系统的启动流程,首先要搞清楚Bootloader。

Bootloader分为三个部分,即处理器内部 ROM 代码(BootROM)、SPL(Secondary Program Loader)、U-Boot(完整 Bootloader)。

处理器内部 ROM 代码(BootROM)是写死在处理器的内部的,而SPL(Secondary Program Loader)、U-Boot(完整 Bootloader)这是可以由u-boot生成的,通常u-boot的镜像文件u-boot-dtb.imx就包含这两个阶段的代码。

整个流程的详解我已经写在了博文 https://blog.youkuaiyun.com/wenhao_ir/article/details/145999721 中,所以到那篇文章中去看吧。

搞清楚上面这篇博文中关于Bootloader的流程详解后,就要看包含Bootloader的后两个阶段的镜像文件u-boot-dtb.imx是如何烧写到eMMC中的,烧写到eMMC中后,又是怎么装载到内存中的,也就是下面一个目录的内容。

百问网的烧写工具烧写镜像文件u-boot-dtb.imx的脚本分析

百问网提供的烧写工具的相关脚本D:\Program Files\100ask_imx6ull_pro开发板系统烧写工具\scripts\basic\emmc\write_boot.clst的详细分析见博文 https://blog.youkuaiyun.com/wenhao_ir/article/details/146012950 【搜索"包含SPL和U-Boot的镜像文件u-boot-dtb.imx烧写到eMMC存储器的脚本分析"】

从上面这篇博文对烧写脚本的分析可知:
镜像文件u-boot-dtb.imx是烧写到了 boot partition 1(boot1)中,而不是 boot partition 2(boot2)中的。并且镜像烧写工具在烧写完成后还把 boot partition 1(boot1)设置为了启动分区,即eMMC启动后,首先从boot partition 1(boot1)向内存发送SPL和U-Boot代码。

另外从博文 https://blog.youkuaiyun.com/wenhao_ir/article/details/145999721 中可以知道,镜像文件u-boot-dtb.imx中包含着Bootloader的后两个阶段,即SPL和U-Boot阶段。

利用百问网的烧写工具将u-boot的镜像文件u-boot-dtb.imx烧写到eMMC中

之前已在博文 https://blog.youkuaiyun.com/wenhao_ir/article/details/145662136 将镜像文件u-boot-dtb.imx烧写到了eMMC中,详细的烧写过程请参考那篇博文。

镜像文件u-boot-dtb.imx烧写到eMMC中,把开发板的启动模式设置为eMMC启动后,再打开串口,启动开发板,就可以看到u-boot正常运行了。

接下来我们需要知道“ u-boot在倒计时完后,首先执行的是哪条命令?具体内容是什么?”

u-boot在倒计时完后,首先执行的是哪条命令?具体内容是什么?

现在我需要知道u-boot在启动后,倒计时完后准备加载内核和设备树,那么它倒计时完后首先执行的是哪条命令?

在U-Boot的启动流程中,倒计时结束后,U-Boot会执行环境变量中定义的启动命令。具体来说,它首先执行的是bootcmd环境变量的内容。

流程分析

  1. 倒计时阶段

    • 在U-Boot启动时,会显示倒计时,例如:
      Hit any key to stop autoboot:  3
      
    • 这个倒计时是由 autoboot_command() 相关代码控制的,主要作用是让用户有机会手动中断自动启动。
  2. 倒计时完成后

    • 如果用户没有按键中断,U-Boot 会执行:
      run_command(env_get("bootcmd"), 0);
      
    • 其中 env_get("bootcmd") 取出 bootcmd 环境变量的内容,并将其传递给 run_command() 执行。

那么如何查看环境变量 bootcmd 的具体内容呢?
其实之前在博文 https://blog.youkuaiyun.com/wenhao_ir/article/details/145902134 中已经详细叙述了方法,并且连具体的内容我都列出了。

环境变量 bootcmd 的内容如下:

bootcmd=run findfdt;run findtee;mmc dev ${mmcdev};mmc dev ${mmcdev}; if mmc rescan; then if run loadbootscript; then run bootscript; else if run loadimage; then run mmcboot; else run netboot; fi; fi; else run netboot; fi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值