在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程序启动过程中,应该首先把环境变量读取到合适的内存区域,然后利用环境变量初始化硬件、启动操作系统等等。
环境变量 | 描述 |
---|---|
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示例进行分析:
setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’
setenv bootargs ‘mem=32M console=ttyS0,115200 root=/dev/ram rw init=/linuxrc’
setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’
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
含义如下:
好了,关于u-boot的环境变量,本次就先介绍到这里,后续还会继续推出其他方面的解读专题,敬请关注!