uboot环境变量中几种启动方式解析

来源:互联网 发布:数据库嵌套not exists 编辑:程序博客网 时间:2024/06/02 02:21

说明:1)板子里原本是没有环境变量的,u-boot的缺省情况下会有一些基本的环境变量,定义在头文件中;

      2)执行了saveenv/save之后,环境变量会第一次保存到nor flash/nand flash/sd卡指定的地址,之后修改、保存、删除等都是基于flash/sd卡中的环境变量的操作。

环境变量如何参与程序运行 
(1)环境变量有2份,分别在Flash和DDR中。uboot开机时一次性从Flash中读取全部的环境变量到DDR中作为环境变量的初始值,uboot使用过程中都是用DDR中的这一份。用户可以使用saveenv指令将DDR中的环境变量重新写入Flash中去更新Flash中的环境变量,下次开机时又会从Flash中再读一次。 
(2)环境变量在uboot中是用字符串表示的,即uboot中是按照字符匹配的方式区分各个环境变量的,在使用时一定要注意正确的输入字符。

1、ramdisk

在Linux中可以将一部分内存mount为分区来使用,通常称之为RamDisk

ramdiskinitrd=echo xxx ...; run findfdt; run loaduimagefat; run loadramdisk; run xxxrargs; setenv bootargs ${bootargs} ; if run loadfdtfat; then bootm ${kloadaddr} - ${fdtaddr}; else bootm ${kloadaddr};fi

步骤:

run findfdt:findfdt=if test $board_name = A335X_SK; then setenv fdtfile am335x-evmsk.dtb; fi; if test $board = AM335x_evm; then setenv fdtfile am335x-evm.dtb; fi

根据板子名字,找内核dtb;

run loaduimagefat:loaduimagefat=fatload mmc ${mmcdev} ${kloadaddr} ${bootfile}

从存储设备mmcdev=0中加载内核bootfile=uImage到kloadaddr=0x80007fc0

run loadramdisk:loadramdisk=fatload mmc ${mmcdev} ${rdaddr} ramdisk.gz

从存储设备mmcdev=0中加载根文件系统ramdisk.gz到rdaddr=0x81000000

run xxxrargs:xxxrargs=setenv bootargs console=${console} ${optargs} root=/dev/ram0 rw ramdisk_size=65536 initrd=${rdaddr},64M rootfstype=${ramrootfstype}

设置控制台console=ttyO0,115200n8

 ${optargs}为空

root=/dev/ram0表示启动的根文件系统位置

rw 加载根文件系统可读写

ramdisk_size=65536指定创建ramdisk的大小

initrd指定初始化ramdisk的位置(前面把ramdisk.gz加载到内存中的位置及占有内存的大小,当没有使用ramdisk启动系统的时候,需要使用noinitrd这个参数,但是如果使用了的话,就需要指定initrd=r_addr,size, r_addr表示initrd在内存中的位置,size表示initrd的大小。

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

如果加载了设备树 loadfdtfat=fatload mmc ${mmcdev} ${fdtaddr} ${fdtfile},则 bootm ${kloadaddr} - ${fdtaddr}

否则 bootm ${kloadaddr}


2、mtdblock


在使用的时候需要按照下面的格式来设置:
mtdparts=mtd-id:<size1>@<offset1>(<name1>),<size2>@<offset2>(<name2>)
注意:
  a)mtd-id 必须要跟你当前平台的flash的mtd-id一致,不然整个mtdparts会失效
  b)size在设置的时候可以为实际的size(xxM,xxk,xx),也可以为'-'这表示剩余的所有空间。
要想这个参数起作用,内核中的mtd驱动必须要支持,即内核配置时需要选上Device Drivers -> Memory Technology Device (MTD) support -> Command line partition table parsing


uboot给kernel传参:bootargs 
(1)linux内核启动时可以接收uboot传递过来的启动参数,这些启动参数的内容和形式是uboot和内核事先约定好的,内核在这些启动参数的指导下完成整个启动过程。该设计方式是为了保证内核在不重新编译的情况下可以使用不同的方式启动。我们需要在uboot中设置环境变量bootargs,然后bootm命令启动内核时会自动将bootargs传给内核。