u-boot传递给内核的参数bootargs和命令bootcmd(上)

来源:互联网 发布:反应热力学计算软件 编辑:程序博客网 时间:2024/05/16 07:16

Bootcmd:

                   Bootcmd是自动启动时默认执行的一些命令,因此可以在当前环境中定义各种不同配置,不通过环境的参数配置,然后设置bootcmd为你经常使用的那种参数。如果要输入分号,记得要这样输入:‘\;’,zImage使用的go addr,uImage使用的是bootm addr.

   Bootargs:

                   Bootargs是环境变量中的重中之重,介绍一些bootargs常用的参数,

1)  root

用来指定rootfs的位置,常见的情况有:

 root=/dev/ram rw

 root=/dev/ram0 rw

上面这两种设置情况是通用的

root=/dev/mtd* rw

root=/dev/mtfblock* rw

root=/dev/mtdblock/* rw

root=31:0x

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

  root=/dev/nfs

在文件系统为基于nfs的文件系统的时候。当然指定root=/dev/nfs之后,还需要指定nfsroot=serverip:nfs_dir,也就是指定文件系统在哪个主机的哪个目录下。

2)  rootfstype

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

3)  mem console initrd、noinitrd

Initrd 和noinitrd 之间的区别和用途

当你没有使用randisk启动系统的时候,你需要使用noinitrd 这个参数,但是如果你使用了的话,就需要制动initrd=r_addr,size,r_addr表示initrd在内存中的的位置,size表示initrd的大小,(从上面的几种情况也可以看出来。使用ramdisk启动并且直接在内存中的时候,就必须使用initrd。)

4)  ramdisk_size

ramdisk=xxxx 不经常使用

ramdisk_size=xxxx  经常使用

上面这两个都可以告诉randisk驱动,创建randisk的size,

5)  mtdparts(在上一篇文章中提到过,这个是u-boot进行对nandflash分区的命令)

mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),128k(uboot)

其中第一个参数fc000000是mtd-id,是设备独一无二的设备号。

6)    cmp
cmp [.b, .w, .l] addr1 addr2 count
- compare memory
cmp命令可以比较2块内存中的内容。.b以字节为单位;.w以字为单位;.l以长字为单位。注意:cmp.b中间不能保留空格,需要连续敲入命令。
第1个参数addr1是第一块内存的起始地址。
第2个参数addr2是第二块内存的起始地址。
第3个参数count是要比较的数目,单位按照字节、字或者长字。

7)  cp
cp [.b, .w, .l] source target count
- copy memory
cp命令可以在内存中复制数据块,包括对Flash的读写操作。
第1个参数source是要复制的数据块起始地址。
第2个参数target是数据块要复制到的地址。这个地址如果在Flash中,那么会直接调用写Flash的函数操作。所以U-Boot写Flash就使用这个命令,当然需要先把对应Flash区域擦干净。
第3个参数count是要复制的数目,根据cp.b cp.w cp.l分别以字节、字、长字为单位。

8) erase
erase start end
- erase FLASH from addr 'start' to addr 'end'
erase N:SF[-SL]
- erase sectors SF-SL in FLASH bank # N
erase bank N
- erase FLASH bank # N
erase all
- erase all FLASH banks
erase命令可以擦Flash。
参数必须指定Flash擦除的范围。
按照起始地址和结束地址,start必须是擦除块的起始地址;end必须是擦除末尾块的结束地址。这种方式最常用。举例说明:擦除0x20000 – 0x3ffff区域命令为erase 20000 3ffff。
按照组和扇区,N表示Flash的组号,SF表示擦除起始扇区号,SL表示擦除结束扇区号。另外,还可以擦除整个组,擦除组号为N的整个Flash组。擦除全部Flash只要给出一个all的参数即可。

9) go
go addr [arg ...]
- start application at address 'addr'
passing 'arg' as arguments
go命令可以执行应用程序。
第1个参数是要执行程序的入口地址。
第2个可选参数是传递给程序的参数,可以不用。

10) mw
mw [.b, .w, .l] address value [count]
- write memory
mw命令可以按照字节、字、长字写内存,.b .w .l的用法与cp命令相同。
第1个参数address是要写的内存地址。
第2个参数value是要写的值。

第3个可选参数count是要写单位值的数目。

11) tftpboot
tftpboot [loadAddress] [bootfilename]
tftpboot命令可以使用TFTP协议通过网络下载文件。按照二进制文件格式下载。另外使用这个命令,必须配置好相关的环境变量。例如serverip和ipaddr。
第1个参数loadAddress是下载到的内存地址。
第2个参数是要下载的文件名称,必须放在TFTP服务器相应的目录下。
这些U-Boot命令为嵌入式系统提供了丰富的开发和调试功能。在Linux内核启动和调试过程中,都可以用到U-Boot的命令。但是一般情况下,不需要使用全部命令。比如已经支持以太网接口,可以通过tftpboot命令来下载文件,那么还有必要使用串口下载的loadb吗?反过来,如果开发板需要特殊的调试功能,也可以添加新的命令。
几种常见的bootargs设置,几种组合

1)  假设文件系统是ramdisk,并且文件系统就在内存中,bootargs的这是应该这样:

Setenvbootargs ‘initrd=0x32000000,0xa00000 rppt=dev/ram0 console=ttySAC0 mem=64m init=/linuxrc’

就像上面提到的那样,如果是使用了ramdisk,就需要initrd这个参数。

2)  如果文件系统是randisk,并且是在flash中,bootargs的设置应该如下:

setenv bootargs ‘mem=32mconsole=ttyS0.115200 root=/dev/ram rw init/linuxrc’

不过这种情况下应该在bootm中指定randisk在flash中的地址,如bootmkernel_addr ramdisk_addr (fdt_addr)

3) 假设文件系统是基于nfs的,bootargs的设置应该如下

   Setenv bootargs ‘noinitrd mem=64console=ttySAC0 root=/dev/nfs nfsroot=192.168.5.111:/nfsip=192.168.5.130:192.168.5.111:192.168.5.1:255.255.255.0::eth0:off’

(注意其中ip所在的那行的参数中 第一个是开发板的IP(ip) 第二个是nfs服务器的ip(serverip),第三个是网关(gateway),第四个是子网掩码(netmask),使用开发板的哪个网卡)

4) 假设文件系统是jffs2类型的,并且在flash中,bootargs的设置应该如下:

Setenv bootargs ‘mem=32console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2init=/linuxrc

内核通过bootargs找到文件系统,bootargs中的mtdblock*就是代表分区。Block0、1 、2、3代表哪个分区,其实bootargs中的“root=/dev/mtdblock*”只是告诉内核,rootfs(开发板的文件系统)从第几个(0 1 2 3)MTD分区挂载,mtdblock0代表第一个分区,mtdblock1代表第二个分区。关于u-boot分区和MTD分区可以参考这篇文章