学懂u-boot之【初探环境变量env/bootcmd/bootargs】

在linux下玩过boot的人都知道,任何一款linux下的boot程序都会有一些运行参数,也可以叫环境变量或者环境参数。比如友善之臂给mini2440开发板标配的SuperViVi这款boot程序,输入q进入命令行模式之后,再输入param show命令,就可以看到下面的信息:

Supervivi> param show
Number of parameters: 9
name                    :          hex             integer
-------------------------------------------------------------
mach_type               :       000007cf                 1999
media_type              :       00000003                    3
boot_mem_base           :       30000000            805306368
baudrate                :       0001c200               115200
xmodem                  :       00000001                    1
xmodem_one_nak          :       00000000                    0
xmodem_initial_timeout  :       000493e0               300000
xmodem_timeout          :       000f4240              1000000
boot_delay              :       01000000             16777216
Linux command line      :       noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0

这就是SpuerViVi自带的缺省环境变量。

而作为更高级的u-boot,它自然也有环境变量,而且种类更加繁多,应用更加深入。在uboot启动过程中,可以通过printenv命令让其输出:

[u-boot@MINI2440]# printenv
bootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.0.1:/home/tekkaman/working/nfs/rootfs ip=192.168.0.2:192.168.0.1:192.168.0.100:255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M
bootcmd=nfs 0x30008000 192.168.0.1:/home/tekkaman/working/nfs/zImage.img;bootm
bootdelay=1
baudrate=115200
ethaddr=08:08:11:18:12:27
ipaddr=192.168.0.2
serverip=192.168.0.1
gatewayip=192.168.0.100
netmask=255.255.255.0
tekkaman=bmp d 70000
stdin=serial
stdout=serial
stderr=serial
ethact=dm9000

Environment size: 470/131068 bytes

这就是我本人目前正在研究的tekkamanninja大神于2010.03移植过来的mini2440定制版的u-boot的原配环境变量全文。至于,环境变量到底是什么,起什么作用,如何修改,如何读写,等等问题,容我们逐一分析。

一、环境变量的概念

环境变量可以理解为用户对软件的全局配置信息,这部分信息应该可以从永久性存储器上读取,能被查询,能被修改。boot程序启动过程中,应该首先把环境变量读取到合适的内存区域,然后利用环境变量初始化硬件、启动操作系统等等。

二、uboot的环境变量

环境变量 描述
bootdelay 执行自动启动的等候秒数
bootargs 传递给内核的启动参数
bootcmd 自动启动时执行的命令
baudrate 串口控制台的波特率
bootfile 缺省的下载文件
serverip 服务器端的ip地址
ipaddr 本地ip地址
netmask 以太网接口的掩码
ethaddr 以太网卡的网卡物理地址
stdin 标准输入设备
stdout 标准输出设备
stderr 标准出错设备

上表中就是u-boot程序中最常见的一些环境变量,当然,不同的版本可能不太一样,但是大同小异。环境变量存放在Flash中,使用下面的命令便可以读取、打印、更改、保存环境变量。

printenv - print environment variables
setenv   - set environment variables
saveenv  - save environment variables to persistent storage

这里要注意的是,当u-boot第一次在板子上运行时,此时Flash里是空的,程序尝试从Flash中读取环境变量时会读取失败,给出下面的提示信息:

Warning - bad CRC or NAND, using default environment

那么,此时所有的变量是以宏的形式定义在程序代码头文件中的(该文件存放于include/configs/<你的板子名称>.h中,如include/configs/mini2440.h),只有你更改了其中某个值并执行了保存的命令之后,所有的参数才会形成一个镜像文件保存到Flash中去,之后所有的操作则是基于Flash而进行的。

下面我们就针对上述表格中的各项变量逐一进行分析:

1、bootcmd

bootcmd=nfs 0x30008000 192.168.1.149:/opt/FriendlyARM/uImage;bootm

表示uboot以nfs的方式加载位置在于192.168.1.149:/opt/FriendlyARM/这个目录下面的uImage文件,加载之后再执行bootm(bootm指令是专门用于启动在SDRAM中的用U-boot的mkimage工具处理过的内核映像。因此在执行bootm命令的时候必须确保image文件已经在内存中)。

2、bootargs

bootargs是环境变量中的重中之重,甚至可以说整个环境变量都是围绕着bootargs来设置的。bootargs的种类非常的多,我们平常只是使用了几种而已,而且随着kernel的发展还会再出现一些新的参数。bootargs非常的灵活,内核和文件系统的不同搭配就会有不同的设置方法。

下面对几种常见的bootargs示例进行分析:

  • 假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下:
setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’
  • 假设文件系统是ramdisk,且在flash中,bootargs的设置应该如下(注意这种情况下你应该要在bootm命令中指定ramdisk在flash中的地址,如bootm kernel_addr ramdisk_addr (fdt_addr)):
setenv bootargs ‘mem=32M console=ttyS0,115200 root=/dev/ram rw init=/linuxrc’
  • 假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下:
setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’
  • 假设文件系统是基于nfs的,bootargs的设置应该如下:
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5:192.168.0.3:192.168.0.3:255.255.255.0::eth0:off’
或者
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5

最后我们再针对mini2440开发板中的bootargs参数进行一次详细的实例解析。参数原文如下:

bootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.0.1:/home/tekkaman/working/nfs/rootfs ip=192.168.0.2:192.168.0.1:192.168.0.100:255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M

含义如下:

  • noinitrd:表示不使用ramdisk启动系统。
  • root=/dev/nfs rw:表示使用基于NFS的文件系统来启动系统,后面的rw表示对该文件系统具有可读可写的权限。
  • nfsroot=192.168.0.1:/home/tekkaman/working/nfs/rootfs:表示NFS文件系统的具体地址。
  • ip=192.168.0.2:192.168.0.1:192.168.0.100:255.255.255.0:依次表示本机(即开发板)的IP地址、NFS服务器的IP地址、本机的网关、子网掩码。
  • console=ttySAC0,115200:表示使用串口0当做输出设备,波特率115200。
  • init=/linuxrc:表示内核启起来后,进入系统中运行的第一个脚本,一般init=/linuxrc, 或者init=/etc/preinit。要注意的是,这里的init=/linuxrc并不是一个固定写法,它指的是/目录下面的linuxrc脚本,一般是一个连接罢了,可以自行更改的。
  • mem=64M:表示指定内存大小为64M。

好了,关于u-boot的环境变量,本次就先介绍到这里,后续还会继续推出其他方面的解读专题,敬请关注!

猜你喜欢

转载自blog.csdn.net/LEON1741/article/details/81777478