天天看点

内核启动参数详解、参数为什么这么设置1 查看内核启动参数2 主要的启动参数有bootargs、bootcmd3 修改启动参数

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:[email protected](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几,如:mtdblock3\mtdclock2;

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) '