BeagleBone Black 从零到一 (2 MLO、U-Boot) 转
文章原址:jexbat.com/categories/BeagleBone/
什么是 U-Boot
熟悉嵌入式开发的应该都听过它,U-boot 就是启动系统前的一段引导程序,虽然是引导程序,但是功能非常强大。
这一篇主要讲解如何从无到有运行 U-Boot,关于 U-Boot 引导 Linux 的部分放在另外一篇文章讲解。
U-Boot 之前的版本以版本号命名如:0.1.0, 0.2.0 这几年改为了以时间和日期命名:U-Boot 2016.03。
使用 git 获得 U-Boot 的源码:
|
|
目前我使用的是 2016.02 的版本。
MLO 及其启动过程
上一篇文章,我们了解了 BeagleBone 有个 SPL 过程,就在这个时候读取 MLO 文件,MLO 文件其实是个精简版的 U-Boot,也是由 U-Boot 生成,但是功能有限,只初始化了部分资源如 DDR,然后启动 U-Boot。
MLO 文件是如何编译出来的
分析 MLO 的编译过程之前需要知道编译原理和 Makefile 等相关知识。
我们先找找 Makefile 看看能不能找到什么。建议使用 Sublime 编辑器。用全局查找功能查找 MLO 关键字。
找到 u-boot/scripts/Makefile.spl
文件 117行
:
u-boot/scripts/Makefile.spl
|
|
可以看到 MLO 文件是由 u-boot-spl.bin
文件通过 mkimage
命令生成的。
再查到 u-boot/Makefile
文件 1310 行
:
u-boot/Makefile
|
|
u-boot-spl.bin
文件是还是由 u-boot/scripts/Makefile.spl
文件生成。
文件 u-boot/scripts/Makefile.spl
168 行
定义了 u-boot-spl.bin
的生成:
u-boot/scripts/Makefile.spl
|
|
因为 SPL_BIN
在 第32行
定义为 u-boot-spl
:
u-boot/scripts/Makefile.spl
|
|
由 168 行
上面的定义可以知道 u-boot-spl.bin
和 u-boot-spl-nodtb.bin
有关系。
接着查找到第223行:
u-boot/scripts/Makefile.spl
|
|
u-boot-spl-nodtb.bin
是通过 objcopy 命令由 u-boot-spl
生成。
再看第246行:
u-boot/scripts/Makefile.spl
|
|
所以u-boot-spl
是由 u-boot-spl.lds
链接文件生成的 ,但是目录下面有几个u-boot-spl.lds
文件,到底是哪个 lds 文件呢,上面是 $(obj)/u-boot-spl.lds
, obj
在 1310 行
编译 u-boot-spl.bin
的时候赋值为 obj=spl
,所以我们需要看 u-boot/spl/u-boot-spl.lds
这个文件,但是如果你之前没有编译过这个文件是没有的。这个文件是如何生成的呢?我们稍后再看,先看 lds 文件的内容:
u-boot/spl/u-boot-spl.lds
|
|
链接文件里面说明了内存布局,arch/arm/cpu/armv7/start.o
代码段都放在 SRAM 中,所以 arch/arm/cpu/armv7/start.S
就是我们要找的东西了。
lds 链接文件的生成
u-boot/spl/u-boot-spl.lds
这个文件的生成在 u-boot/scripts/Makefile.spl
有解释:
u-boot/scripts/Makefile.spl
|
|
LDSCRIPT
的定义:
u-boot/scripts/Makefile.spl
|
|
可见 Makefile.spl
文件中先是判断有没有指定的 lds 文件,如果没有指定的,就查找 board 文件夹中目标板目录下面有没有 lds 文件,如果没有就查找相应的 cpu 目录,因为我们目标器件是 am335x,所以发现有 u-boot/arch/arm/cpu/armv7/am33xx/u-boot-spl.lds
再通过 cpp_lds
命令编译成,cpp_lds
是一组命令的集合,具体定义还是在 Makefile.spl
文件中,我们查看 u-boot/arch/arm/cpu/armv7/am33xx/u-boot-spl.lds
也发现 MLO 文件代码是在 start.S
文件中。
MLO 程序分析
查看 start.S
分析下 MLO 程序具体的执行流程,MLO 的 makefile 会根据 CONFIG_SPL_BUILD
编译不同的源文件,同样的在源码内也通过 CONFIG_SPL_BUILD
控制不同的代码执行,前面一部分 MLO 文件和 U-Boot 是类似的,进入到 _main
函数中两个程序的功能就开始出现差异了:
|
|
当 U-Boot 重定位好代码、向量表之后,运行 board_init_r
函数,此函数会调用 init_sequence_r
列表里面的函数初始化各种外设驱动,最后在 main_loop()
函数中运行,U-Boot 有个 bootdelay
延时启动,如果不手动停止 U-Boot 会自动运行 bootcmd
包含的命令。
内核引导这部分放在另外一篇文章详细讲解。
U-Boot 编译
编译 U-Boot
编译 U-Boot 前我们需要安装交叉编译器:
|
|
下载 U-Boot 源码:
|
|
因为 U-Boot 官方已经支持了 Beaglebone Black 所以配置文件也已经自带了,编译输入如下命令:
|
|
片刻后会生成 MLO
和 u-boot.img
文件。
配置 U-Boot 参数
有两种方式可以配置 U-Boot 的一些参数,分别是 uEnv.txt
和 boot.src
文件。
U-Boot 启动的时候会在启动分区寻找这两个文件。
boot.scr: This file is a U-Boot script. It contains instructions for U-Boot. Using these instruction, the kernel is loaded into memory, and (optionally) a ramdisk is loaded. boot.scr can also pass parameters to the kernel. This file is a compiled script, and cannot be edited directly. In some cases, boot.scr loads further instructions and configuration parameters from a text file.
uEnv.txt: A file with additional boot parameters. This file can be read by boot.scr, or by the boot sequence if there is no script file. uEnv.txt is a regular text file that can be edited. This file should have Unix line ending, so a compatible program must be used when editing this file.
U-Boot 启动的时候如果不打断会调用 bootcmd
包含的命令来执行,通常 bootcmd
会调用 bootscript 脚本也就是boot.scr
里面的命令进行执行, boot.scr
通常也会先读取 uEnv.txt
确定额外参数,因为 boot.src
文件必须通过 boot.cmd
文件编译而来, uEnv.txt
则是可以任意编辑,这样可配置性就大大提高了。如果没有 boot.src
文件,U-Boot 有默认配置的 bootcmd
命令。
在 Beagelbone Black 中我们不需要额外的 boot.scr
文件,用默认的命令即可,默认的命令为:
|
|
run distro_bootcmd
最终会调用 run mmcboot
命令加载 uEnv.txt
文件,并且会运行 uEnv.txt
文件里面 uenvcmd
指代的命令。
uEnv.txt
从网络启动例子:
|
|
制作 U-Boot 的 SD 启动卡
制作 SD 启动卡之前首先需要为 SD 卡分区, ROM Code 启动的时候如果是从 MMC 设备加载启动代码,ROM Code 会从第一个活动分区寻找名为 “MLO” 的文件,并且此分区必须为 FAT文件系统。所以制作 U-Boot 的启动卡只需要一个带有 MLO 和 U-Boot 镜像的 FAT 格式的 SD 卡,如果需要启动 Linux 内核还需要别的分区,我们以后再讲。
有两种方式可以制作包含 U-Boot 的可启动的 SD 卡,一种是用 RAW Mode 的方式,还有一种是用 FTA 的方式。
RAW Mode 和烧写方式在这篇文章里面有讲:解析 BeagleBone Black 官方镜像。
FTA 模式下只要建立一个 FTA 分区再把 MLO 和 uboot.img 文件拷贝进去即可。
我是使用的 USB 读卡器,插入后 Linux /dev/
目录会显示 /dev/sd*
设备,我这里多出两个设备分别显示 /dev/sdb
和 /dev/sdb1
,其中 /dev/sdb
表示一整个物理磁盘, /dev/sdb1
表示的是具体的分区。
使用命令 sudo fdisk /dev/sdb
管理磁盘:
a
: toggle a bootable flag(设置或取消启动表示)
b
: edit bsd disklabel(编辑 bsd disklabel)
c
: toggle the dos compatibility flag
d
: delete a partition (删除一个分区)
l
: list known partition types (列出已知的分区类型)
m
: print this menu (打印次列表)
n
: add a new partition (增加一个新分区)
o
: create a new empty DOS partition table (建立一个新的空 DOS 分区表)
p
: print the partition table (打印分区表)
q
: quit without saving changes (不保存退出)
s
: create a new empty Sun disklabel
t
: change a partition’s system id
u
: change display/entry units
v
: verify the partition table (验证分区表)
w
: write table to disk and exit (把分区表写入磁盘)
x
: extra functionality (experts only) (额外的功能)
新建启动分区:
|
|
建立好新的分区之后需要命名并格式化:
|
|
格式化之后挂载磁盘并把 MLO
文件和 u-boot.img
文件拷贝进去:
|
|
接着把 SD 卡插入 Beaglebone Black 并且按着 S2 按钮上电,从串口打印出的信息我们可以看到 U-Boot 已经可以正常启动了:
|
|
启动之后,前面一段打印信息是 MLO 程序打印出来的,读取 U-Boot 之后开始运行完整的 U-Boot,之后程序扫描各个设备读取 boot.scr
和 uEnv.txt
文件,接着再读取是否有 Linux 内核可以运行。
参考资料
- Beaglebone Black——制作自己的SD启动卡
- U-Boot on BeagleBone Black
- AM335x U-Boot User’s Guide
- Pandaboard bootload(uboot) 启动流程探究
- u-boot启动流程
BeagleBone Black 从零到一 (2 MLO、U-Boot) 转相关推荐
- Spring 官方修复零日漏洞,推出 Spring Boot 2.6.6、2.5.12 等新版本
一.漏洞说明 这个漏洞还要从 3 月 29 日晚间说起! 彼时有不少网友爆料,Spring 框架出现 "史诗级" RCE 漏洞,平地一声雷,一时之间,快要入睡的开发者们纷纷坐起查看 ...
- Java零基础可以直接入门spring boot吗?
不推荐.一般学习的路线是java基础,然后数据库,接着是spring,了解spring的核心思想,再学springmvc,之后才学springboot. 什么是Spring Boot Spring B ...
- Beaglebone Black教程BeagleBone Black安装最新系统映像
Beaglebone Black教程BeagleBone Black安装最新系统映像 BeagleBone Black安装最新系统映像 Beaglebone Black虽然已经预装了Debian操作系 ...
- Beaglebone Black LCD 支持,BB VIEW配置
1. 制作TF卡[PC上操作] Ø 打开官网http://beagleboard.org/latest-images,下载最新映像: https://debian.beagleboard.org/ ...
- openwrt (三)入门FAQ
openwrt作为一个基于linux开发的比较完善的嵌入式系统,可以快速移植到各种平台上.初次下载开源代码后,简单浏览后很是诧异,居然没看到uboot和kernel部分的代码,甚至没看到任何模块的代码 ...
- 大星星学物联网概览篇-开发板
7 开发板 选择板子的时候考虑:处理器速度.RAM.连网.USB.功耗.与传感器和其他电路的接口.物理尺寸和外形(芯片尺寸和装配的复杂性). 如果项目不涉及非常复杂的处理工作,例如只是需要有联网能力和 ...
- java web开源项目源码_适合Java新手的开源项目集合——在 GitHub 学编程
作者:HelloGitHub-老荀 当今互联网份额最大的编程语言是哪一个?是 Java!这两年一直有听说 Java 要不行了.在走下坡路了.没错,Java 的确在走下坡路,未来的事情的确不好说,但是瘦 ...
- 8.2设备文件及磁盘分区
2019独角兽企业重金招聘Python工程师标准>>> 概览: 设备文件的创建 权限 设备名 类型 主设备号 次设备号 mknod [-m MODE ...
- JavaWeb项目+MVC三层架构+Mysql+Tomcat+汽车配件销售系统前后端+可以用于学习javaweb项目入门
JavaWeb项目+MVC三层架构+Mysql+Tomcat+汽车配件销售系统前后端+可以用于学习javaweb项目入门 可以用于课程设计.毕业设计的知识点入门学习 提示:此资源仅用于javaweb网 ...
- Create a Bootable 8G MicroSD Card for e-puck with wifi+webcam
*** delete all incorrect/ crappy/ garbage on your pc all the time.*** Use files in "good_2.6.36 ...
最新文章
- ThinkPHP V5.0.5漏洞_漏洞考古:thiknphp5 代码执行漏洞
- 实操《深入浅出React和Redux》第二期—Flux
- mac os 安装 pkg-config
- python一到10整数的平方和_零基础学python_10_列表(创建数值列表 )
- tp中怎么执行mysql事务_tp中使用事务
- PDB调试Python程序
- 【输入一个数,判断是否为素数(质数)】
- Hbase具体操作(图文并茂且超超全~~~)
- 服务器不能安装exe文件,云服务器安装exe文件
- [译] Bulma: 2018年你应该关注的CSS框架
- 数字图像处理(三)直方图规定化
- 数据库五种约束以及添加方法
- Fiddler+夜神模拟器+xposed+justTrustMe手机抖音抓包
- mooc-人工智能与信息社会-人工智能发展简史
- Android之头像图片变圆形
- 28个UI免费漂亮的切换开关PSD下载
- 敏感词汇检测及返回敏感源词汇
- UEFI 中的Gmac网卡驱动实现
- Ubuntu Linux 安装 QQ音乐打不开的问题
- 解决typora beta版本过期提示
热门文章
- Python非线性拟合笔记
- 数字化模型是工业PaaS平台的核心
- Php维语翻译,维语翻译_维吾尔翻译_维语翻译在线
- matlab动态图阿基米德螺旋,魔兽世界M基尔加丹阿基米德螺旋线之Matlab动图!国服加油...
- Laravel重写或者覆盖vender下面的方法
- tpshop报 商业用途必须购买正版,使用盗版将追究法律责任
- python耗时方法_Python中统计函数运行耗时的方法
- 手撕:经典问题的遗传算法代码
- 代码弱鸡竟然在CSDN写烘焙博客
- Java 岗面经:两年半经验,面 10 个公司,经 28 轮面试,拿 9 个 offer,涨麻了。