在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=dm9000Environment 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的环境变量,本次就先介绍到这里,后续还会继续推出其他方面的解读专题,敬请关注!

玩转u-boot之【初探环境变量env/bootcmd/bootargs】相关推荐

  1. 如何修改uboot的环境变量env的值来指定uImage的名字

    今天继续玩基于uboot的nfs.昨天总算是基本搞清了make zImage和make uImage的区别,那么今天就来实际编译几个玩一玩. 不过,在利用mkimage工具对zImage镜像文件加工完 ...

  2. linux命令之查看当前shell环境变量-env

    linux下运行程序进程经常出现由于环境问题导致的程序找不到动态库的情况,因为一般程序是通过ld_library_path这个环境变量查找用户动态库的. 不过也可以指定用户定义环境变量,还有就是一个叫 ...

  3. thinkphp环境变量.env配置

    打开网站根目录www/tp5/  新建 .env 打开.env 书写变量配置(不能使用中文): 书写格式 name=Lee age=12   [array] columnname=name colum ...

  4. 从bootm 命令讲起/U-boot的环境变量: bootcmd 和bootargs

    从bootm 命令讲起 1 找到linux的内核入口 Bootm命令通过读取uImage的头部0×40字节的信息,将uImage定位到正确的地址,同时找到linux的内核入口地址. 这个地方就涉及到u ...

  5. uboot环境变量(设置bootargs向linux内核传递正确的参数)

    http://blog.csdn.net/workhorse/article/details/7071428 这是我uboot的环境变量设置,在该设置下可以运行initram内核(从内存下载到nand ...

  6. vue cli3 热更新 保存时自动刷新页面内容 + 分离环境变量.env package.json配置

    前几天ts+vue3.0+view-design撸了一个项目,然后总感觉哪里不对劲,今天终于醒悟了原来是热更新没开 在vue.config.js中配置以下选项 const IS_PRO = ['pro ...

  7. CC00046.LinuxShell——|LinuxShell$变量.V03|——|环境变量|ENV|修改默认提示符|

    一.环境变量:环境变量设置 ### --- 环境变量设置 ~~~ 使用 export 声明的变量即是环境变量[root@localhost ~]# export age="18" ...

  8. vue3+vite中使用环境变量 .env 的一些配置情况说明

    在项目文件中新建文件.env .env.pro 两个文件其中.env 是默认设置 .env.pro 为正式环境设置 1.设置.env中的内容信息 注意vue3+vite 必须使用VITE开头的配置信息 ...

  9. Linux命令之查看环境变量env

    概述 env 命令可以查看环境变量和删除环境变量. 该命令用于显示系统中已存在的环境变量,以及在定义的环境中执行指令.若没有设置任何选项和参数时,则直接显示当前系统的环境变量. 语法 该命令的语法如下 ...

最新文章

  1. ttc转换ttf字体在线_R 语言画图中英文字体解决方案
  2. python汉化之后好用吗_买了《Python学习手册(中文第4版)》后悔了
  3. 数据库里面的id不是连续的,遍历的时候
  4. Fabric--CA 应用与配置
  5. makefile文件中的依赖关系理解
  6. celery delay 没反应
  7. Flowable 数据库表结构 ACT_HI_TASKINST
  8. 计算机基础八进制和十六进制试题,计算机基础知识考试试题
  9. TableviewController基础
  10. 如何避免开源安全噩梦?
  11. arcgis加载天地图_【arcgis地图实战】之天地图在线服务加载
  12. 软考对程序员的作用,对程序员有多大意义?
  13. 操作系统原理1-3章答案 黑新宏 胡元义主编
  14. 电脑笔记本利用谷歌浏览器进行网页截长图滚动截图
  15. 青年大学习里的粉色玩偶介绍
  16. SSL_WRITE在断网时的表现
  17. Python文本挖掘练习(一)// 新闻摘要
  18. Scroller的使用
  19. fastjson1.2.24TemplatesImpl利用链源码分析
  20. Joinquant 指数10大持仓等比买入

热门文章

  1. linux 电池管理软件,Linux电源管理(2)_Generic PM之基本概念和软件架构
  2. swagger-bootstrap-ui 1.9.3 发布,i18n及自定义文档支持
  3. spring boot学习(5): 进程exit code自定义
  4. Less常用语法整理
  5. 科普向--详解JavaScript中的数据类型
  6. 崩溃日志记录Landroid/support/v4/animation/AnimatorCompatHelper
  7. Azure恢复服务-使用Windows Backup恢复文件
  8. html area图片热点
  9. CCF NOI1035 数根
  10. 关于处理小数点位数的几个oracle函数