以下内容源于网络资源的学习与整理,如有侵权请告知删除。

一、bootargs简介

bootargs是uboot环境变量中的重中之重。

它的种类非常多,使用非常灵活,内核和文件系统的不同搭配就会有不同的设置方法,甚至也可以不设置bootargs,而直接将其写到内核中去(在内核配置时可以设置)。

bootargs由许多用空格隔开的项目组成,每个项目中都是“项目名=项目值”。它会被内核解析成一个个“项目名=项目值”的字符串,这些字符串又会被再次解析从而影响启动过程。

二、bootargs中的常见项目

1、root=

这个项目用来指定rootfs的位置, 常见的情况有:

//mtd是字符设备,而mtdblock是块设备
//下面的'x'在具体的例子里需要用数字表示
root=/dev/mtdx rw 
root=/dev/mtdblockx rw   //比较通用
root=/dev/mtdblock/x rw
root=31:0x          //如果可以直接指定设备名,那么也可以使用此设备的设备号。

所学的课程中,root的情形如下:
(1)如果在nandflash上,则root=/dev/mtdblock2;
(2)如果在inand/sd上,则root=/dev/mmcblk0p2(设备0的第二分区))。
(3)如果是nfs,则root=/dev/nfs。此情形还需要指定nfsroot=serverip:nfs_dir,即指明文件系统存在哪个主机的哪个目录下面。

2、rootfstype=

这个项目表示根文件系统的文件系统类型,需要与root配合使用。
根文件系统的类型一般有jffs2、yaffs2、ext2、ext3、ubi等等。
如果ext2文件系统,有没有这个选项是无所谓的,但如果是jffs2、squashfs等文件系统,就需要rootfstype指明文件系统的类型,不然会无法挂载根分区。

3、console=

(1)这个项目是控制台信息声明,比如“console=/dev/ttySAC0,115200”,就表示控制台使用串口0,波特率是115200。

(2)内核启动时,会根据console=这个项目来初始化硬件,并且重定位console到具体的一个串口上,所以这里的传参会影响后续是否能从串口终端上接收到内核的信息。

(3)console常见的情形

  • 比如console=tty,表示使用虚拟串口终端设备。
  • 比如console=ttyS[n,options],表示使用特定的串口n,options的形式为“bbbpm”,这里bbb是指串口的波特率,p是奇偶位(没有使用过),m是指的bits。
  • 比如console=ttySAC[n,options],含义同上面。比如console=/dev/ttySAC0,115200,表示控制台使用串口0,波特率是115200。

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

4、mem=

这个项目用来告诉内核当前系统的内存有多少,不是必须的。

5、ramdisk_size=

这个项目用来告诉ramdisk驱动,创建的ramdisk的大小。

默认情况下是4M,可以查看Documentation/ramdisk.txt找到相关的描述。

不过ramdisk=xxxxx在新版内核都已经没有提及了,不推荐使用。

6、initrd=, noinitrd

当没有使用ramdisk启动系统的时候,需要使用noinitrd这个项目。

如果使用了,就需要指定“ initrd=r_addr,size ”。其中r_addr表示initrd在内存中的位置,size表示initrd的大小。

7、init=

这个项目用来指定进程1的程序路径,一般init=/linuxrc, 或者init=/etc/preinit。

很多初学者以为init=/linuxrc是固定写法,其实不然,/linuxrc指的是/目录下面的linuxrc脚本,一般指向busybox。

preinit的内容一般是创建console、null设备节点,运行init程序,挂载一些文件系统等等操作。

8、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:@(),@()

这里面有几个必须要注意的。
(1)mtd-id 必须要跟你当前平台的flash的mtd-id一致,不然整个mtdparts会失效。
(2)size在设置的时候可以为实际的size(xxM,xxk,xx),也可以为'-'这表示剩余的所有空间。

举例:假设flash 的mtd-id是sa1100,那么你可以使用下面的方式来设置:

mtdparts=sa1100:-    //只有一个分区
mtdparts=sa1100:256k(ARMboot)ro,-(root)  //有两个分区

可以查看drivers/mtd/cmdlinepart.c中的注释找到相关描述。

9、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'

5、rootfs在SD/iNand/Nand/Nor等物理存储器上。这种对应产品正式出货工作时的情况。

setenv bootargs 'console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3'

6、rootfs在nfs上,这种对应我们实验室开发产品做调试的时候。

setenv bootargs 'root=/dev/nfs nfsroot=192.168.1.100:/root/rootfs/ ip=192.168.1.20:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200'
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐