uboot的环境变量——bootargs简介
以下内容源于网络资源的学习与整理,如有侵权请告知删除。
以下内容源于网络资源的学习与整理,如有侵权请告知删除。
一、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'
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)