【Linux】Petalinux U-Boot

描述

部分图片和经验来源于网络,若有侵权麻烦联系我删除,主要是做笔记的时候忘记写来源了,做完笔记很久才写博客。

专栏目录:记录自己的嵌入式学习之路-CSDN博客


目录

[0 引导流程示例](#0 引导流程示例)

[1 进入U-Boot](#1 进入U-Boot)

[2 常用U-Boot操作命令](#2 常用U-Boot操作命令)

[2.1 查看命令帮助](#2.1 查看命令帮助)

[2.2 查看板子信息](#2.2 查看板子信息)

[2.3 查看环境变量](#2.3 查看环境变量)

[2.4 网络相关命令](#2.4 网络相关命令)

[2.5 mmc操作命令](#2.5 mmc操作命令)

[2.6 文件系统操作命令](#2.6 文件系统操作命令)

[2.7 系统引导命令](#2.7 系统引导命令)

[2.8 其他常用命令](#2.8 其他常用命令)

[3 常用环境变量](#3 常用环境变量)

[3.1 修改环境变量的方式](#3.1 修改环境变量的方式)

[3.2 bootdelay](#3.2 bootdelay)

[3.3 bootargs](#3.3 bootargs)

[3.4 网络相关环境变量](#3.4 网络相关环境变量)

[4 U-Boot的默认引导过程](#4 U-Boot的默认引导过程)

[4.1 执行bootcmd](#4.1 执行bootcmd)

[4.2 distro_bootcmd内容](#4.2 distro_bootcmd内容)

[4.3 boot_targets内容](#4.3 boot_targets内容)

[4.4 bootcmd_{target}内容](#4.4 bootcmd_{target}内容)


0 引导流程示例


1 进入U-Boot

在启动带有U-Boot的Zynq板子时,在倒计时前键入任意键就能阻止autoboot从而进入U-Boot部分。

进入后可以发现U-Boot操作方式与Linux命令类似。


2 常用U-Boot操作命令

2.1 查看命令帮助

(1) help

查看U-Boot支持的所有命令。

(2) ? <命令> 或 help <命令>

查看命令的具体用法。

2.2 查看板子信息

bdinfo

查看DRAM的起始地址和大小、启动参数保存起始地址、波特率、sp(堆栈指针)起始地址等信息。

2.3 查看环境变量

printenv/print

U-Boot中的环境变量都是字符串

2.4 网络相关命令

(1) dhcp

使用DHCP服务为板子获取IP地址,前提是板子连接到路由器而不是直连到主机上。

(2) ping <ip地址>

测试网络能否ping通。

(3) nfs命令

nfs [loadAddress] [[hostIPaddr:]bootfilename]

表示将hostIPaddr这个IP对应主机的bootfilename文件下载到DRAM的loadAddress位置上,示例:

前提是主机需要安装并开启nfs-kernel-server,并已在/etc/exports文件中对NFS服务进行文件夹和权限的配置。

(4) tftpboot命令

tftpboot [loadAddress] [[hostIPaddr:]bootfilename]

与nfs命令相似,都是用于通过网络下载文件到DRAM中,只是协议不同。该命令的前提也是已经在主机配置好了tftp服务器及共享路径。除此以外,其主机文件路径可以省略,可以只写文件名:

2.5 mmc操作命令

uboot支持EMMC和SD卡,因此提供了这类mmc的操作命令。

其中,mmc info看到的是当前MMC设备的信息,使用mmc dev [dev] [part]可以进行选择。

2.6 文件系统操作命令

(1) FAT文件系统命令:

fatinfo:查询指定MMC指定分区的文件系统信息;

fatls:查询FAT格式设备的目录和文件信息;

fstype:查看MMC设备某个分区的文件系统格式;

fatload:命令用于将指定的文件读取到DRAM中;

fatwirte:将DRAM中的数据写入到MMC设备中;

(2) EXT文件系统命令:

ext2load、ext2ls、ext4load、ext4ls、ext4write,其用法与FAT文件系统的类似,分别针对ext2和ext4文件系统。

2.7 系统引导命令

要启动Linux,需要先将Linux镜像文件拷贝到DRAM中,如果使用到设备树的话也需要将设备树拷贝到DRAM中。当镜像文件和设备树文件加载到DRAM后,就可以使用bootm、bootz、boot等命令执行系统引导。

(1) bootm <addr> [initrd[:size]] <fdt>

**addr:**uImage文件所在的内存地址;

**initrd:**initrd文件在内存中的地址和大小,可以不指定,不指定时用"-"代替。其实就是根文件系统的地址,一般用RAMDISK文件(ramdisk.cpio.gz.u-boot)做根文件系统才需要指定,用EXT4根文件系统时无需指定;

**size:**initrd文件的大小;

**fdt:**dtb文件在内存中的地址,由petalinux-config -c u-boot中的Default DTB pickup address设定;

**其他信息:**由于image.ub包含了uImage规定的头部信息,因此bootm也可以用来引导image.ub镜像。引导image.ub时只需要image.ub的偏移即可,无需其他参数。

(2) booti <addr> [initrd[:size]] [fdt]

与bootm类似,不过addr是Image文件所在的内存地址,不是uImage。

(3) bootz <addr> [initrd[:size]] [fdt]

与bootm类似,不过addr是zImage文件所在的内存地址,不是uImage。

(4) boot

使用u-boot环境变量中的bootcmd引导系统。其实就是执行bootcmd的内容。

2.8 其他常用命令

(1) reset

系统复位重启

(2) run <cmd>

运行环境变量中定义的命令,如run bootcmd。


3 常用环境变量

3.1 修改环境变量的方式

**setenv <环境变量名> '<值>':**临时修改环境变量,因为环境变量是被加载到DRAM中的,掉电就会丢失。如环境变量包含多个值,就用空格隔开。若环境变量仅有单个值且值中不含空格,可以省略引号。

**saveenv:**将当前DRAM中的环境变量写入到非易失性存储器中,使得U-Boot重启后它还在。具体使用哪个非易失性存储器,可由Petalinux配置。

**删除环境变量的方法:**给环境变量赋空值,即直接setenv <环境变量名>。

3.2 bootdelay

开机时倒计时进行autoboot的时间。

3.3 bootargs

用于传递给内核的信息,主要用来告诉内核分区信息和根文件系统所在的分区。Zynq使用EXT4根文件系统时,bootargs需要包含以下内容,否则系统的启动有可能会报错无法找到根文件系统:

root=/dev/mmcblk0p2 rw rootwait

该参数说明了根文件系统位于第一张SD卡/eMMC存储器的第2个分区中。

3.4 网络相关环境变量

其中,需要确保板子的IP和Ubuntu的IP在同一网段内;serverip为Ubuntu的IP地址。

4 U-Boot的默认引导过程

4.1 执行bootcmd

bootcmd=run distro_bootcmd

实际就是执行distro_bootcmd。

4.2 distro_bootcmd内容

distro_bootcmd=for target in {boot_targets}; do run bootcmd_{target}; done

其实就是循环每一个boot_targets,并尝试执行其对应的引导命令,直到成功引导进入系统为止。不行就会一直循环。

4.3 boot_targets内容

boot_targets=qspi jtag mmc0 mmc1 qspi nand nor usb0 usb1 pxe dhcp

这里表示引导方式,最开始多出来一个qspi,可能是因为在petalinux或者什么地方设置过qspi优先引导,所以添加了一个在前面。

这里的顺序就代表着引导的顺序。

4.4 bootcmd_${target}内容

其实就是各模式实际的引导命令内容,根据模式的不同,其实际的内容也不同。

下面以bootcmd_qspi内容为例子:

bootcmd_qspi=sf probe 0 0 0 && sf read {scriptaddr} {script_offset_f} {script_size_f} \&\& echo QSPI: Trying to boot script at {scriptaddr} && source ${scriptaddr}; echo QSPI: SCRIPT FAILED: continuing...;

bootcmd_qspi在这里其实就是通过QSPI FLASH加载boot.scr文件并依据脚本文件内容进行引导。

相关推荐
望获linux22 分钟前
北京亦庄机器人马拉松:人机共跑背后的技术突破与产业启示
linux·人工智能·机器人·操作系统·开源软件·rtos·具身智能
张槊哲2 小时前
字符和编码(python)
linux·数据库·python
IT阳晨。5 小时前
【嵌入式Linux】基于ARM-Linux的zero2平台的智慧楼宇管理系统项目
linux·arm开发
_清风来叙5 小时前
【Linux】Linux内核模块开发
linux·arm开发
于齐龙6 小时前
pip 常用命令及配置
linux·python·pip
让子弹飞026 小时前
24.Linux中RTC的驱动实验_csdn
linux·ubuntu·stm32mp157·驱动的分离和分层·rtc时间
Johny_Zhao6 小时前
在Ubuntu Server上安装Checkmk监控系统
linux·人工智能·网络安全·信息安全·云计算·shell·yum源·系统运维·checkmk
努力学习的小廉7 小时前
深度理解linux系统—— 进程优先级
linux·运维·服务器
浅安的邂逅7 小时前
Linux进程7-signal信号处理方式验证、可重入函数举例、信号集函数验证、信号集阻塞验证
linux·c语言·vim·进程通信·gcc
胖大和尚7 小时前
Linux C++ xercesc xml 怎么判断路径下有没有对应的节点
xml·linux·c++