内核启动参数详解、参数为什么这么设置

2019-07-13 01:29发布

1 查看内核启动参数

在uboot界面中输入printenv,即可查看启动参数。 示例:
jz2440:

OpenJTAG> printenv bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0 bootdelay=2 baudrate=115200 ethaddr=08:00:3e:26:0a:5b ipaddr=192.168.7.17 serverip=192.168.7.11 netmask=255.255.255.0 mtdids=nand0=nandflash0 mtdparts=mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root) bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 bootatgs=noinitrd root=/dev/nfs nfsroot=192.168.7.21:/home/book/workspace/jz2440/systems/firstbusybox ip=192.168.7.17:192.168.7.21:192.168.7.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 console=ttySAC0 filesize=791340 bootargs=console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 stdin=serial stdout=serial stderr=serial partition=nand0,0 mtddevnum=0 mtddevname=bootloader Environment size: 742/131068 bytes

hi3518e淘宝:


hisilicon # printenv baudrate=115200 bootfile="uImage" da=mw.b 0x82000000 ff 1000000;tftp 0x82000000 u-boot.bin.img;sf probe 0;flwrite du=mw.b 0x82000000 ff 1000000;tftp 0x82000000 user-x.cramfs.img;sf probe 0;flwrite dr=mw.b 0x82000000 ff 1000000;tftp 0x82000000 romfs-x.cramfs.img;sf probe 0;flwrite dw=mw.b 0x82000000 ff 1000000;tftp 0x82000000 web-x.cramfs.img;sf probe 0;flwrite dc=mw.b 0x82000000 ff 1000000;tftp 0x82000000 custom-x.cramfs.img;sf probe 0;flwrite up=mw.b 0x82000000 ff 1000000;tftp 0x82000000 update.img;sf probe 0;flwrite ua=mw.b 0x82000000 ff 1000000;tftp 0x82000000 upall_verify.img;sf probe 0;flwrite tk=mw.b 0x82000000 ff 1000000;tftp 0x82000000 uImage; bootm 0x82000000 dd=mw.b 0x82000000 ff 1000000;tftp 0x82000000 mtd-x.jffs2.img;sf probe 0;flwrite ipaddr=192.168.1.10 serverip=192.168.1.107 netmask=255.255.255.0 ethaddr=00:12:12:22:b4:71 HWID=8043420004048425 bootargs=mem=38M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),3M(kernel),12M(rootfs) bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x300000;bootm 0x82000000 bootdelay=5 stdin=serial stdout=serial stderr=serial verify=n ver=U-Boot 2010.06-svn (Mar 27 2014 - 11:56:37) Environment size: 1179/65532 bytes
     hi3518e自己:
hisilicon # printenv bootdelay=1 baudrate=115200 ethaddr=00:00:23:34:45:66 ipaddr=192.168.1.10 serverip=192.168.1.2 netmask=255.255.255.0 bootfile=uImage bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000 bootargs=mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),9M(rootfs) stdin=serial stdout=serial stderr=serial verify=n ver=U-Boot 2010.06 (Jun 01 2017 - 02:38:54) Environment size: 424/262140 bytes

2 主要的启动参数有bootargs、bootcmd

2.1 bootargs

示例:jz2440:
bootargs=console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 bootatgs=noinitrd root=/dev/nfs nfsroot=192.168.7.21:/home/book/workspace/jz2440/systems/firstbusybox              ip=192.168.7.17:192.168.7.21:192.168.7.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 hi3518e淘宝: bootargs=mem=38M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),3M(kernel),12M(rootfs)
hi3518e自己: bootargs=mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),9M(rootfs)
详解:
console=ttySAC0  :
console=ttySAC0  使用虚拟串口终端设备 . 为什么是ttySAC0: 这个网址将的比较透彻: ttySAC0与/dev/tts/0是否对应同一个物理设备串口0:http://blog.csdn.net/yiya1989/article/details/8253240 在内核中有一个串口驱动和我们的console参数比较的一个过程,所以两者要一致; jz2440为什么是ttySAC0:     S3C2410的驱动文件drivers/serial/s3c2410.c中将串口驱动的名字定义为:.name = S3C24XX_SERIAL_NAME, // 这个宏被定义为"ttySAC"   driver/serial/s3c2410.c有:#define S3C24XX_SERIAL_NAME"ttySAC" hi3518e为什么是ttyAMA0:   因为海思源码:drivers/tty/serial/amba-pl011.c中将串口驱动的名字定义为:.name = "ttyAMA",
   
mem:mem=xxM 指定内存的大小,不是必须的
root=/dev/mtdblock2:
root=/dev/mtdx rw
root=/dev/mtdblockx rw
root=/dev/mtdblock/x rw
root=31:0x
就是说你的root分区在你flash的第几分区,在第几分区就是mtdblockx几,如:mtdblock3mtdclock2; hi3518e的板子设置mtdparts分区信息时,设置了三个分区第三个是root分区所以是root=/dev/mtdblock2 上面的这几个在一定情况下是通用的,当然这要看你当前的系统是否支持,不过mtd是字符设备,而mtdblock是块设备,有时候你的挨个的试到底当前的系统支持上面那种情况下,不过root=/dev/mtdblockx rw比较通用。此外,如果直接指定设备名可以的话,那么使用此设备的设备号也是可以的。
root=/dev/nfs
在文件系统为基于nfs的文件系统的时候使用。当然指定root=/dev/nfs之后,还需要指定nfsroot=serverip:nfs_dir,即指明文件系统存在那个主机的那个目录下面
rootfstype=jffs2:
rootfstype 设置文件系统类型rootfstype=jffs2
    这个选项需要跟root一起配合使用,一般如果根文件系统是ext2的话,有没有这个选项是无所谓的,但是如果是jffs2,squashfs等文件系统的话,就需要rootfstype指明文件系统的类型,不然会无法挂载根分区.
mtdparts=hi_sfc:1M(boot),4M(kernel),9M(rootfs):
flash分区信息; 要想这个参数起作用,内核中的mtd驱动必须要支持
按这个格式来设置:mtdparts=mtd-id:@(),@()
mtd-id 必须要跟你当前平台的flash的mtd-id一致,不然整个mtdparts会失效
init:
init指定的是内核启起来后,进入系统中运行的第一个脚本,一般init=/linuxrc, 或者init=/etc/preinit,preinit的内容一般是创建console,null设备节点,运行init程序,挂载一些文件系统等等操作。请注意,很多初学者以为init=/linuxrc是固定写法,其实不然,/linuxrc指的是/目录下面的linuxrc脚本,一般是一个连接罢了。


2.2 bootcmd参数

bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000 uboot引导完的最后一步就是调用bootcmd参数驱动内核:怎么启动呢,就是把在flash中的内核烧写到ram中,并运行那段代码; 前面有说过bootcmd是自动启动时默认执行的一些命令,因此你可以在当前环境中定义各种不同配置,不同环境的参数设置,然后设置bootcmd为你经常使用的那种参数。

3 修改启动参数

其实打开uboot界面输入?,就会返回uboot下我们可以使用的命令,其中包括参数设置的相关参数。
修改:bootargs参数
YAFFS启动参数设置:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3; save //实测有效
jffs2设置启动参数:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2; save
nfs系统启动:
改后的信息:setenv bootargs  noinitrd   root=/dev/nfs  nfsroot=192.168.7.21:/home/book/workspace/jz2440/systems/firstbusybox  ip=192.168.7.17:192.168.7.21:192.168.7.1:255.255.255.0::eth0:off  init= /linuxrc  console=ttySAC0
原信息:set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
saveenv
修改:bootcmd参数
setenv bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000'saveenv
setenv bootargs 'mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),9M(rootfs) '