U_boot 的 bootcmd 和bootargs参数详解

 U-boot的环境变量值得注意的有两个: bootcmd 和bootargs。
u-bootcmd
    前面有说过bootcmd是自动启动时默认执行的一些命令,因此你可以在当前环境中定义各种不同配置,不同环境的参数设置,然后设置bootcmd为你经常使用的那种参数。
u-bootargs
    bootargs是环境变量中的重中之重,甚至可以说整个环境变量都是围绕着bootargs来设置的。bootargs的种类非常非常的多,我们平常只是使用了几种而已,感兴趣的可以看看这篇文章说的很全:http://blog.chinaunix.net/u2/79570/showart_1675071.html。bootargs非常的灵活,内核和文件系统的不同搭配就会有不同的设置方法,甚至你也可以不设置bootargs,而直接将其写到内核中去(在配置内核的选项中可以进行这样的设置),正是这些原因导致了bootargs使用上的困难。
    下面介绍一下bootargs常用参数,bootargs的种类非常的多,而且随着kernel的发展会出现一些新的参数,使得设置会更加灵活多样。

A. root 
用来指定rootfs的位置, 常见的情况有: 
    root=/dev/ram rw   
    root=/dev/ram0 rw
  请注意上面的这两种设置情况是通用的,我做过测试甚至root=/dev/ram1 rw和root=/dev/ram2 rw也是可以的,网上有人说在某些情况下是不通用的,即必须设置成ram或者ram0,但是目前还没有遇到,还需要进一步确认,遇到不行的时候可以逐一尝试。

    root=/dev/mtdx rw
    root=/dev/mtdblockx rw
    root=/dev/mtdblock/x rw
    root=31:0x

上面的这几个在一定情况下是通用的,当然这要看你当前的系统是否支持,不过mtd是字符设备,而mtdblock是块设备,有时候你的挨个的试到底当前的系统支持上面那种情况下,不过root=/dev/mtdblockx rw比较通用。此外,如果直接指定设备名可以的话,那么使用此设备的设备号也是可以的。

    root=/dev/nfs
在文件系统为基于nfs的文件系统的时候使用。当然指定root=/dev/nfs之后,还需要指定nfsroot=serverip:nfs_dir,即指明文件系统存在那个主机的那个目录下面。

B. rootfstype 
    这个选项需要跟root一起配合使用,一般如果根文件系统是ext2的话,有没有这个选项是无所谓的,但是如果是jffs2,squashfs等文件系统的话,就需要rootfstype指明文件系统的类型,不然会无法挂载根分区.

C. console 
console=tty  使用虚拟串口终端设备 .
console=ttyS[,options] 使用特定的串口,options可以是这样的形式bbbbpnx,这里bbbb是指串口的波特率,p是奇偶位(从来没有看过使用过),n是指的bits。
console=ttySAC[,options] 同上面。

看你当前的环境,有时用ttyS,有时用ttySAC,网上有人说,这是跟内核的版本有关,2.4用ttyS,2.6用ttySAC,但实际情况是官方文档中也是使用ttyS,所以应该是跟内核版本没有关联的。可以查看Documentation/serial-console.txt找到相关描述。

D. mem
mem=xxM 指定内存的大小,不是必须的

E. ramdisk_size
ramdisk=xxxxx           不推荐   
ramdisk_size=xxxxx   推荐
上面这两个都可以告诉ramdisk 驱动,创建的ramdisk的size,默认情况下是4m(s390默认8M),你可以查看Documentation/ramdisk.txt找到相关的描述,不过ramdisk=xxxxx在新版的内核都已经没有提了,不推荐使用。

F. initrd, noinitrd
当你没有使用ramdisk启动系统的时候,你需要使用noinitrd这个参数,但是如果使用了的话,就需要指定initrd=r_addr,size, r_addr表示initrd在内存中的位置,size表示initrd的大小。

G. init
init指定的是内核启起来后,进入系统中运行的第一个脚本,一般init=/linuxrc, 或者init=/etc/preinit,preinit的内容一般是创建console,null设备节点,运行init程序,挂载一些文件系统等等操作。请注意,很多初学者以为init=/linuxrc是固定写法,其实不然,/linuxrc指的是/目录下面的linuxrc脚本,一般是一个连接罢了。

H. mtdparts
mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),38272k(user),256k(env),384k(uboot)
要想这个参数起作用,内核中的mtd驱动必须要支持,即内核配置时需要选上Device Drivers  ---> Memory Technology Device (MTD) support  ---> Command line partition table parsing

mtdparts的格式如下:
mtdparts=[;
  := :[,]
  := [@offset][][ro]
   := unique id used in mapping driver/device
    := standard linux memsize OR "-" to denote all remaining space
    := (NAME)
因此你在使用的时候需要按照下面的格式来设置:
mtdparts=mtd-id:@(),@()
这里面有几个必须要注意的:
a.  mtd-id 必须要跟你当前平台的flash的mtd-id一致,不然整个mtdparts会失效
b.  size在设置的时候可以为实际的size(xxM,xxk,xx),也可以为'-'这表示剩余的所有空间。
举例:
假设flash 的mtd-id是sa1100,那么你可以使用下面的方式来设置:
mtdparts=sa1100:-     →  只有一个分区
mtdparts=sa1100:256k(ARMboot)ro,-(root)  →  有两个分区
可以查看drivers/mtd/cmdlinepart.c中的注释找到相关描述。

I. ip
指定系统启动之后网卡的ip地址,如果你使用基于nfs的文件系统,那么必须要有这个参数,其他的情况下就看你自己的喜好了。设置ip有两种方法:
ip = ip addr
ip=ip addr:server ip addr:gateway:netmask::which netcard:off
这两种方法可以用,不过很明显第二种要详细很多,请注意第二种中which netcard 是指开发板上的网卡,而不是主机上的网卡。

说完常见的几种bootargs,那么我们来讨论平常我经常使用的几种组合:
1). 假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下:
setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’

2). 假设文件系统是ramdisk,且在flash中,bootargs的设置应该如下:
setenv bootargs ‘mem=32M console=ttyS0,115200 root=/dev/ram rw init=/linuxrc’
注意这种情况下你应该要在bootm命令中指定ramdisk在flash中的地址,如bootm kernel_addr ramdisk_addr (fdt_addr)

3). 假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下
setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’

4). 假设文件系统是基于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’

  常用的bootargs参数设置备忘录 

 set bootargs root=/dev/ram0 rw console=ttySAC0,115200 mem=64M ramdisk=32768 initrd=0x30800000,20M init=/linuxrc

setenv bootcmd tftpboot 0x33000000 uImage-rtc\; tftpboot 0x30800000 initrd_fs-nfs.img\; bootm 33000000
set serverip 192.168.167.150

kgdb debug :
setenv bootargs root=/dev/ram0 rw console=ttySAC0,115200 mem=64M ramdisk=32768 initrd=0x30800000,20M init=/linuxrc kgdbwait 8250kgdb=0,115200
setenv bootargs root=/dev/ram0 rw console=ttyKGDB,115200 mem=64M ramdisk=32768 initrd=0x30800000,20M init=/linuxrc kgdbwait 8250kgdb=0,115200 
setenv bootargs root=/dev/ram0 rw console=ttySAC0,115200 mem=64M ramdisk=32768 initrd=0x30800000,20M init=/linuxrc ip=192.168.167.100 kgdbwait 
[email=kgdboe=@192.168.167.150/,@192.168.167.100/]kgdboe=@192.168.167.150/,@192.168.167.100/[/email]
kgdb-oe ok
setenv bootargs root=/dev/ram0 rw console=ttySAC0,115200 mem=64M ramdisk=32768 initrd=0x30800000,20M init=/linuxrc  kgdbwait 
[email=kgdboe=@192.168.167.100/,@192.168.167.150/]kgdboe=@192.168.167.100/,@192.168.167.150/[/email]
root=/dev/ram0 rw console=ttySAC0,115200 mem=64M ramdisk=32768 initrd=0x30800000,20M init=/linuxrc
jk2410 nfs ok
setenv bootargs noinitrd init=/linuxrc root=/dev/nfs nfsroot=192.168.167.150:/work/nfs ip=192.168.167.15:192.168.167.150:192.168.167.254:255.255.255.0:jk2410:eth0:off console=ttySAC0,115200 mem=64M ramdisk=32768
setenv bootargs noinitrd init=/linuxrc root=/dev/nfs nfsroot=192.168.167.162:/home/leibian/qtopia_arm/nfs ip=192.168.167.15:192.168.167.162:192.168.167.254:255.255.255.0:jk2410:eth0:off console=ttySAC0,115200 mem=64M ramdisk=32768
omap5912 nfs ok
setenv bootargs noinitrd init=/linuxrc root=/dev/nfs nfsroot=192.168.167.168:/work/0015/inird-v5t-sunny/ramdisk-v5t,nolock ip=192.168.167.15:192.168.167.168:192.168.167.254:255.255.255.0:omap5912:eth0:off console=ttyS0,115200n8 mem=30M ramdisk=32768
note: ,nolock后面不要加rsize=1024,wsize=1024,timeo=15 ,一旦加了以后,console的信息就乱掉了。
而且不能ip=dhcp ,因为我们公司根本就没有dhcp server ,就要 ip=192.168.167.15:192.168.167.168:192.168.167.254:255.255.255.0:omap5912:eth0:off
先擦后写
nand erase  400000   400000
nand erase  800000   800000
nand write  33000000  400000     170000
nand write  30800000  800000     1c0000
jffs2 ok
setenv bootargs noinitrd root=/dev/mtdblock4 rootfstype=jffs2 rw console=ttySAC0,115200 mem=64M init=/linuxrc
cramfs 
setenv bootargs noinitrd root=/dev/mtdblock3 rootfstype=cramfs  console=ttySAC0,115200 mem=64M init=/linuxrc

一般的nfs mount :
mount -t nfs 192.168.167.150:/work/nfs /nfs -o nolock,rsize=1024,wsize=1024,timeo=15

# /tmpfs/bonnie\+\+  -s0  -d /jffs2/
Create files in sequential order...

done.
Stat files in sequential order...done.
Delete files in sequential order...
done.
Create files in random order...
done.
Stat files in random order...done.
Delete files in random order...done.
Version  1.03       ------Sequential Create------ --------Random Create--------
(none)              -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16   135  97  9752  97   144  95   134  94 26006 100   147  96
(none),,,,,,,,,,,,,,16,135,97,9752,97,144,95,134,94,26006,100,147,96

 

posted @ 2015-03-07 18:05  来杯绿茶  阅读(885)  评论(0编辑  收藏  举报