本帖最后由 风精灵 于 2025-2-14 11:14 编辑

uboot中环境变量的作用就是在不改变源码、不用重新编译的情况下,可以使我们通过设置环境变量的值来改变uboot的一些设置。uboot开机时会一次性从存储介质(启动介质)中读取全部的环境变量到内存中作为环境变量的初始值,uboot运行过程中用到的环境变量,都是内存中的环境变量,用户可以使用saveenv指令将内存中的环境变量重新写入存储介质(启动介质)中,下次重启系统时会从存储介质(启动介质)中读取更新过的环境变量。

一、查看环境变量
输入printenv命令,即可查看所有环境变量(图片只截取了一部分):
图片1.png
图中我们看到环境变量的基本模式是:变量名=变量值,这个变量值就是一串字符串,程序通过解析字符串,得到所需参数(如baudrate=115200)或者所要执行的操作(如mmcargs)。

二、增改删环境变量

(一)我们可以添加一个自己的环境变量,比如添加一个firstenv变量,并设置值为elf:
=>setenv firstenv elf
保存:
=>saveenv
saveenv命令是保存环境变量到eMMC Flash,如果不使用此命令,那么只是将环境变量存储到了内存中,断电之后,此变量将丢失。
然后使用printenv命令查看环境变量添加成功:
=>printenv
filesize=5fa38
firstenv=elf
image=zImage
或者使用“printenv 变量名”查看:
=> printenv firstenv
firstenv=elf

(二)更改环境变量的值,这次我们不保存saveenv:
=> setenv firstenv imx6ull
然后使用printenv命令查看结果,变量值更改成功:
=> printenv firstenv
firstenv imx6ull

(三)删除一个环境变量,删除firstenv环境变量,使用setenv变量名,不赋任何值:
=> setenv firstenv
=> saveenv
使用printenv查看结果,发现该变量不存在,表示删除成功:
=> printenv firstenv
# # Error: “firstenv” not defined

三、bootargs
bootargs是一个重要的环境变量,主要是给内核传递参数,整个环境变量都是围绕着bootargs来设置的。bootargs非常的灵活,内核和文件系统的不同搭配就会有不同的设置方法。下面介绍一下bootargs常用参数,bootargs的种类繁多,而且随着kernel的发展会出现一些新的参数,使得设置会更加灵活多样。
我们现在使用printenv bootargs命令查看一下bootargs环境变量:
=> printenv bootargs
# # Error: “bootargs” not defined
可以看到bootargs并没有设置,使用printenv命令查看,发现bootargs是在mmcargs环境变量中设置的,而mmcargs是在bootdelay倒计时结束之后,由bootcmd(bootcmd介绍在下一节)执行的:
图片2.png
我们使用run命令执行一下mmcargs:
=> run mmcargs
然后再printenv bootargs,可以看到bootargs环境变量设置成功:
=> printenv bootargs
bootargs=console=ttymxc0,115200 calibrate=y root=/dev/mmcblk1p2 rootwait rw
其中:
console:表示使用的串口终端控制台,这里使用的是ttymxc0,波特率是115200。
root:表示文件系统相关参数。其中/dev/mmcblk1p2表示rootfs文件系统挂载分区为mmcblk1的p2分区。
rootwait是指等待设备/dev/mmcblk1p2设备就绪后才尝试挂载rootfs。如果没有此参数,Linux内核启动时可能会在存储设备尚未就绪时就尝试挂载rootfs,此时肯定挂载失败,那么启动也就失败了。
rw:声明启动权限,即以读写方式启动。

四、bootcmd
bootcmd在bootdelay倒计时结束之后开始执行的第一条命令,主要用于启动内核。例如:
=> printenv bootcmd
bootcmd=run findfdt;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
这个bootcmd的就是一个命令集,根据设置好的环境变量,按照一定的逻辑启动内核。关于此处的启动逻辑不再深入讲解,有兴趣的可以展开其中环境变量进行深究。

五、bootdelay
用于倒计时,等待用户进入命令行。经过以上章节讲解,通过senenv可以设置bootdelay时间。
=> printenv bootdelay
bootdelay=3


    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Powered by Discuz! X3.5  © 2001-2013 Comsenz Inc.