uboot环境变量设置(大地小神之个人收藏)

合集下载

uboot环境变量设置(大地小神之个人收藏)

uboot环境变量设置(大地小神之个人收藏)

u-boot的环境变量u-boot的环境变量是使用u-boot的关键,它可以由你自己定义的,但是其中有一些也是大家经常使用,约定熟成的,有一些是u-boot 自己定义的,更改这些名字会出现错误,下面的表中我们列出了一些常用的环境变量:上面只是一些最基本的环境变量,请注意,板子里原本是没有环境变量的,u-boot的缺省情况下会有一些基本的环境变量,在你执行了saveenv之后,环境变量会第一次保存到flash中,之后你对环境变量的修改,保存都是基于保存在flash中的环境变量的操作。

U-boot的环境变量值得注意的有两个:bootcmd 和bootargs◆b o o t c m d前面有说过bootcmd是自动启动时默认执行的一些命令,因此你可以在当前环境中定义各种不同配置,不同环境的参数设置,然后设置bootcmd为你经常使用的那种参数。

◆b o o t a r g sbootargs是环境变量中的重中之重,甚至可以说整个环境变量都是围绕着bootargs来设置的。

bootargs的种类非常非常的多,我们平常只是使用了几种而已,感兴趣的可以看看这篇文章说的很全:/u2/79570/showart_1675071.html。

bootargs非常的灵活,内核和文件系统的不同搭配就会有不同的设置方法,甚至你也可以不设置bootargs,而直接将其写到内核中去(在配置内核的选项中可以进行这样的设置),正是这些原因导致了bootargs使用上的困难。

下面介绍一下bootargs常用参数,bootargs的种类非常的多,而且随着kernel的发展会出现一些新的参数,使得设置会更加灵活多样。

A.r o o t用来指定r o o t f s的位置,常见的情况有:root=/dev/ram rwroot=/dev/ram0 rw请注意上面的这两种设置情况是通用的,我做过测试甚至root=/dev/ram1 rw和root=/dev/ram2 rw也是可以的,网上有人说在某些情况下是不通用的,即必须设置成ram或者ram0,但是目前还没有遇到,还需要进一步确认,遇到不行的时候可以逐一尝试。

《uboot环境变量:详谈bootcmd和bootargs》

《uboot环境变量:详谈bootcmd和bootargs》

《uboot环境变量:详谈bootcmd和bootargs》1.uboot中的环境变量bootdelay:执⾏⾃动启动的等候秒数baudrate:串⼝控制台的波特率netmask:以太⽹接⼝的掩码ethaddr:以太⽹卡的⽹卡物理地址bootfile:缺省的下载⽂件bootargs:传递给内核的启动参数bootcmd:⾃动启动时执⾏的命令serverip:服务器端的ip地址ipaddr:本地ip 地址stdin:标准输⼊设备stdout:标准输出设备stderr:标准出错设备 以上是⼀些基本的环境变量。

uboot中⼀般会有⼀些缺省的环境变量。

在启动uboot后会将参数放在特定的FLASH区域,之后由kernel去获取解析。

还有另⼀种⽅法设置环境变量就是在uboot启动后进⼊命令⾏模式,设置环境变量,然后执⾏saveenv后,会将设置的环境变量保存到特定区域的FLASH中,由kernel去获取解析。

其中bootargs和bootcmd相对⽐较重要。

2.bootargs解析root: ⽬前很多新的开发板都是使⽤FLASH作为存储。

因为很多都直接使⽤MTD驱动程序。

MTD 驱动程序的主要优点在于 MTD 驱动程序是专门为基于闪存的设备所设计的,所以它们通常有更好的⽀持、更好的管理和基于扇区的擦除和读写操作的更好的接⼝。

Linux 下的 MTD驱动程序接⼝被划分为两类模块:⽤户模块和硬件模块。

有两个流⾏的⽤户模块可启⽤对闪存的访问: MTD_CHAR 和 MTD_BLOCK 。

MTD_CHAR 提供对闪存的原始字符访问,⽽ MTD_BLOCK 将闪存设计为可以在上⾯创建⽂件系统的常规块设备(象 IDE 磁盘)。

与MTD_CHAR 关联的设备是 /dev/mtd0、mtd1、mtd2(等等),⽽与 MTD_BLOCK 关联的设备是 /dev/mtdblock0、mtdblock1(等等)。

由于 MTD_BLOCK 设备提供象块设备那样的模拟,通常更可取的是在这个模拟基础上创建象 FTL 和 JFFS2 那样的⽂件系统。

uboot环境变量总结

uboot环境变量总结

Common目录下面与环境变量有关的文件有以下几个:env_common.c,env_dataflash.c,env_eeprom.c,env_flash.c,env_nand.c,env_nowhere.c,env_nvram.c,environment.c。

env_common.c中包含的是default_environment[]的定义;env_dataflash.c,env_eeprom.c,env_flash.c,env_nand.c, env_nvram.c中包含的是相应存储器与环境变量有关的函数:env_init(void),saveenv(void),env_relocate_spec (void),env_relocate_spec (void),use_default()。

至于env_nowhere.c,因为我们没有定义CFG_ENV_IS_NOWHERE,所以这个文件实际上没有用。

environment.c这个文件时是我真正理解环境变量的一个关键。

在这个文件里定义了一个完整的环境变量的结构体,即包含了这两个ENV_CRC(用于CRC校验),Flags(标志有没有环境变量的备份,根据CFG_REDUNDAND_ENVIRONMENT这个宏定义判断)。

定义这个环境变量结构体的时候还有一个非常重要的关键字:__PPCENV__,而__PPCENV__在该.c文件中好像说是gnu c编译器的属性,如下:# define __PPCENV__ __attribute__ ((section(".text")))意思是把这个环境变量表作为代码段,所以在编译完UBOOT后,UBOOT的代码段就会有环境变量表。

当然,这要在我们定义了ENV_IS_EMBEDDED之后才行,具体而言,环境变量表会在以下几个地方出现(以nand flash为例):1、UBOOT中的代码段(定义了ENV_IS_EMBEDDED),2、UBOOT中的默认环境变量, 3、紧接UBOOT(0x0 ~ 0x1ffff)后面:0x20000 ~ 0x3ffff 之间,包括备份的环境变量,我们读取,保存也是对这个区域(即参数区)进行的。

uboot命令使用教程(uboot参数设置)

uboot命令使用教程(uboot参数设置)

uboot命令使⽤教程(uboot参数设置)1. Printenv 打印环境变量。

uboot> printenvbaudrate=115200ipaddr=192.168.0.111ethaddr=32:34:46:78:9A:DCserverip=192.168.0.100Environment size: 80/8188 bytes2. Setenv 设置新的变量如:uboot> setenv myboard AT91RM9200DKuboot> saveenvuboot> printenvbaudrate=115200ipaddr=192.168.0.111ethaddr=32:34:46:78:9A:DCserverip=192.168.0.100myboard=AT91RM9200DKEnvironment size: 102/8188 bytes⼜如想重置启动参数bootargs:uboot> setenv bootargs 'noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0'uboot> saveenv3. saveenv 保存变量命令将当前定义的所有的变量及其值存⼊ flash 中。

⽤来存储变量及其值的空间只有 8k 字节,应不要超过。

(如上例,每次与setenv配合使⽤)4. loadb 通过串⼝ Kermit 协议下载⼆进制数据。

5. tftp 通过⽹络下载程序,需要先设置好⽹络配置简单配置:uboot> setenv ethaddr 32:34:46:78:9A:DCuboot> setenv ipaddr 192.168.0.111uboot> setenv serverip 192.168.0.100//下载 bin ⽂件到地址 0x20000000 处。

uboot的bootcmd bootargs参数详解

uboot的bootcmd bootargs参数详解
或者
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5’
上面就是我们经常使用的几种bootargs的组合,老实说,bootargs非常非常的灵活,所以设置的方法有很多中形式,具体的还应该根据你的平台具体的情况来设置。
mtdparts的格式如下:
mtdparts=[;
:= :[,]
:= [@offset][][ro]
:= unique id used in mapping driver/device
:= standard linux memsize OR "-" to denote all remaining space
3). 假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下
setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’
这两种方法可以用,不过很明显第二种要详细很多,请注意第二种中which netcard 是指开发板上的网卡,而不是主机上的网卡。
说完常见的几种bootargs,那么我们来讨论平常我经常使用的几种组合:
1). 假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下:
setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’

uboot源码分析(2)uboot环境变量实现简析

uboot源码分析(2)uboot环境变量实现简析

uboot源码分析(2)uboot环境变量实现简析uboot 环境变量实现简析----------基于u-boot-2010.03u-boot的环境变量是使⽤u-boot的关键,它可以由你⾃⼰定义的,但是其中有⼀些也是⼤家经常使⽤,约定熟成的,有⼀些是u-boot⾃⼰定义的,更改这些名字会出现错误,下⾯的表中我们列出了⼀些常⽤的环境变量:bootdelay 执⾏⾃动启动的等候秒数baudrate 串⼝控制台的波特率netmask 以太⽹接⼝的掩码ethaddr 以太⽹卡的⽹卡物理地址bootfile 缺省的下载⽂件bootargs 传递给内核的启动参数bootcmd ⾃动启动时执⾏的命令serverip 服务器端的ip地址ipaddr 本地ip 地址stdin 标准输⼊设备stdout 标准输出设备stderr 标准出错设备上⾯只是⼀些最基本的环境变量,请注意,板⼦⾥原本是没有环境变量的,u-boot的缺省情况下会有⼀些基本的环境变量,在你执⾏了saveenv之后,环境变量会第⼀次保存到flash或者eeprom中,之后你对环境变量的修改,保存都是基于保存在flash中的环境变量的操作。

环境变量可以通过printenv命令查看环境变量的设置描述,通过setenv 命令进⾏重新设置,设置完成后可以通过saveenv将新的设置保存在⾮易失的存储设备中(nor flash 、nand flash 、eeprom)。

例如:setenv bootcmd "nand read 0x30008000 0x80000 0x500000;bootm 0x30008000"saveenv通过这两条命令就完成了环境变量bootcmd的重新设置,并讲其保存在固态存储器中。

下⾯简单分析下uboot中环境变量的实现流程。

uboot启动后,执⾏玩start.S中的汇编程序,将跳⼊board.c 中定义的start_arm_boot()函数中,在该函数中,uboot讲完成板⼦外设和相关系统环境的初始化,然后进⼊main_loop循环中进⾏系统启动或者等待与⽤户交互,这其中就包括环境变量的初始化和重定位。

如何设置u-boot变量ip地址

如何设置u-boot变量ip地址

Uboot 下查看环境变量命令pri主机IP为 192.168.110.101用户手册设置如下:u-boot>setenv etnaddr 11:22:33:44:55:66u-boot>setenv ipaddr 192.168.0.54u-boot>setenv serverip 192.168.0.55请问这样可以吗?应该就是这样了,是不是还要设置下gatewayip和netmask。

楼主别忘了用saveenv保存环境变量。

u-boot>setenv etnaddr 11:22:33:44:55:66 是设置板子的mac地址。

u-boot>setenv ipaddr 192.168.0.54是设置板子的IP地址。

u-boot>setenv serverip 192.168.0.55是设置提供内核下载的服务器IP地址。

还需要u-boot>setenv gatewayip 192.168.0.1 设置网关u-boot>setenv netmask 255.255.255.0 设置子网掩码可能还需要有其他的设置,看一下用户手册上的说明和例子。

最后u-boot>saveenv谢谢【windows主机】ip 192.168.0.55默认网关 192.168.0.1子网掩码 255.255.255.0【目标板】ipaddr 192.168.0.54serverip192.168.0.55gatewayip 192.168.0.1netmask 255.255.255.0这样可以吗?是不是主机ip要和serverip完全一样?是不是主机ip要和serverip完全一样?不是, 和tftp服务器的ip一样就可以, 我的tftp就在虚拟机里, 所以和window不一样我的是在windows下通过超级终端 u-boot已经烧写好了用交叉线直接将pc和开发板连起来网口用tftp烧写内核时出错TFTP error: 'File not found' (1)找不到文件这是怎么回事啊?。

环境变量配置步骤

环境变量配置步骤

环境变量配置步骤环境变量配置步骤环境变量是操作系统中的一些特定值,它们用于定义系统的行为。

在计算机中,每个程序都有自己的环境变量,这些变量用于存储程序运行所需要的信息。

在本文中,我们将详细介绍如何配置环境变量。

第一步:打开控制面板首先,我们需要打开控制面板。

在Windows操作系统中,我们可以通过点击“开始”按钮,在搜索框中输入“控制面板”来打开控制面板。

在MacOS操作系统中,则需要点击屏幕左上角的苹果图标,在弹出菜单中选择“系统偏好设置”,然后选择“用户与群组”,接着点击右下角的锁形图标以解锁设置。

第二步:选择系统和安全选项在Windows操作系统中,我们需要选择“系统和安全”选项来进入环境变量设置界面。

在MacOS操作系统中,则需要选择“高级选项”。

第三步:进入环境变量设置界面在Windows操作系统中,我们需要点击“高级系统设置”选项,并切换到“高级”选项卡,在下方找到“环境变量”按钮并点击即可进入环境变量设置界面。

在MacOS操作系统中,则需要点击右下角的“高级选项”,然后选择“环境变量”。

第四步:添加新的环境变量在环境变量设置界面中,我们可以看到两个列表:用户变量和系统变量。

用户变量只对当前登录的用户有效,而系统变量则对整个系统有效。

如果我们需要添加一个新的环境变量,我们需要点击“新建”按钮,在弹出的对话框中输入环境变量名称和值,并选择是要将其添加到用户变量还是系统变量中。

第五步:编辑已有的环境变量如果我们需要修改已有的环境变量,我们可以在相应的列表中找到该变量,并点击“编辑”按钮来进行修改。

在弹出的对话框中,我们可以修改环境变量值或者删除该环境变量。

第六步:删除已有的环境变量如果我们需要删除已有的环境变量,我们可以在相应的列表中找到该变量,并点击“删除”按钮来进行删除。

在弹出的确认对话框中,我们需要确认是否要删除该环境变量。

总结通过以上几个简单步骤,我们就可以轻松地配置和管理操作系统中的环境变量了。

uboot 命令详解

uboot 命令详解

u-boot 技术文档1.U boot 命令详解1.1查看帮助命令使用help 或者?1.2环境变量打印环境变量:printenv设置环境变量:setenv(不会保存)保存环境变量:saveenv这个时候就有了1.3nandflash命令使用nand查看nandflash 所有指令擦除nand erase1.4norflash命令查看Flash信息命令: flinfo加/解写保护命令: protect擦除命令: erase1.5内存命令nm1.5USB指令使用help usb 查看usb具体指令使用usb 启动使用usb tree查看信息f atls usb 0 罗列u盘信息1.5.1实例演练usb指令烧写1.6实例演练ftp指令烧写环境变量中体现了开发板上的IP地址为192.168.0.2,网关为192.168.0.1,要求电上的tftp 服务器的IP为192.168.0.1;运行电脑上tftp服务器,指定好根目录,将内核和根文件系统放在根目录下。

注:线接上后,电脑上的本地连接可能是显示网络电缆没插好,这很正常!在使用过程中它们会自动去连接!<2>分别下载内核和根文件系统到内存0x30008000开始的空间先检查坏块nand bad再擦除坏块清理某个区域0x560000 0x3b22c00将根文件系统加载到0x30008000然后再将根文件系统写到0x560000 0x3b22c00这个位置然后重启:重复上面的步骤:nand erase 0x60000 0x267000将内核文件保存到0x60000 0x267000这块区域运行1.8系统重启指令2.U boot 内核移植在cpu/arm920t/start.S中添加以下代码在修改并添加为以下代码在include/configs/mini2440.h修改为如下:将以下代码修改为:将以下代码修改为:将以下代码修改为:在drivers/mtd/nand/s3c2410_nand.h 在最后下面代码上添加如下带码:。

UBOOT——环境变量的实现原理

UBOOT——环境变量的实现原理

UBOOT——环境变量的实现原理uboot 环境变量实现原理:⾸先我们先要搞清楚uboot中环境变量的作⽤,uboot中环境变量的作⽤就是在不改变源码、不⽤重新编译的情况下,可以使我们通过设置环境变量的值来改变uboot的⼀些设置,如bootdelay时间、机器码的值等等。

下⾯我们来具体看⼀下uboot中环境变量如何实现⾸先看⼀下环境变量的初始化函数: env_init定义在commen/env_movi.c中函数中实际执⾏的就是把default_environment的地址赋值给全局变量gd中的env_addr 和env_valid两个值;int env_init(void){#if defined(ENV_IS_EMBEDDED)#else /* ENV_IS_EMBEDDED */gd->env_addr = (ulong)&default_environment[0];gd->env_valid = 1;#endif /* ENV_IS_EMBEDDED */return (0);}来看⼀下default_environment数组在来看⼀下env_relocate 这个函数重点是⼀下两句代码 env_ptr = (env_t *)malloc (CFG_ENV_SIZE); 这句代码作⽤是给uboot环境变量开辟⼀块16k⼤⼩的内存 env_relocate_spec (); 这句代码的作⽤是把sd卡中的uboot环境变量整个分区复制到开辟的这个内存地址处; void env_relocate (void){#ifdef ENV_IS_EMBEDDED#else/** We must allocate a buffer for the environment*/env_ptr = (env_t *)malloc (CFG_ENV_SIZE);DEBUGF ("%s[%d] malloced ENV at %p\n", __FUNCTION__,__LINE__,env_ptr);#endifif (gd->env_valid == 0) {}else {env_relocate_spec ();}gd->env_addr = (ulong)&(env_ptr->data);}通过movi_read_env函数把sd卡中的环境变量复制到内存中主药⽤到的是 movi_read_env(virt_to_phys((ulong)env_ptr)); 函数 crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc  use_default()三个函数: movi_read_env把sd卡中的uboot的环境变量分区复制到env_ptr中; crc32 计算内存中环境变量的crc的值,如果不相等则执⾏ use_default函数 void env_relocate_spec (void){#if !defined(ENV_IS_EMBEDDED)uint *magic = (uint*)(PHYS_SDRAM_1);if ((0x24564236 != magic[0]) || (0x20764316 != magic[1]))movi_read_env(virt_to_phys((ulong)env_ptr));if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)return use_default();#endif /* ! ENV_IS_EMBEDDED */}下⾯看⼀下use_default函数的代码:1:输出*** Warning - bad CRC or moviNAND, using default environment:2:清0环境变量内存,把default_environment中的值复制到环境变量内存3:计算crc,写⼊内存中的crc位4:设置gd中的env_valid为1;static void use_default(){puts ("*** Warning - bad CRC or moviNAND, using default environment\n\n");if (default_environment_size > CFG_ENV_SIZE){puts ("*** Error - default environment is too large\n\n");return;}memset (env_ptr, 0, sizeof(env_t));memcpy (env_ptr->data,default_environment,default_environment_size);env_ptr->crc = crc32(0, env_ptr->data, ENV_SIZE);gd->env_valid = 1;}这样环境变量初始化算是完成了;我们在回顾⼀下环境变量初始化都做了哪些⼯作:1:在uboot还没有初始化flash设备(nand movinand 等flash)的时候,先进⾏环境变量初级初始化,即把gd全局变量中的 env_valid = 1;2:初始化完flash设置以后就要进⾏环境变量的重定位⼯作了,即把环境变量从flash中copy到内存中,⽤⼀个全局变量env_ptr指向这段内存;复制⼯作时通过movi_read_env这个函数实现的,实际就是把sd卡中环境变量分区全部复制到env_ptr指向的这段内存中,然后在对这段内存中的环境变量进⾏crc校验,如果失败的话,则把default_enviroment 中的环境变量复制到这⾥;(这⾥对代码分析env_relocate函数中⽤malloc设置了⼀段内存来存放环境变量,⼀直没有⽤free来释放这段内存,这⾥是否存在安全隐患?)------------------------------------------------------------------------------------------------------------接下来我们在看⼀下uboot中关于环境变量的⼀些命令第⼀个 printenv 实现函数为do_printfenv代码如下:1int do_printenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])2 {3int i, j, k, nxt;4int rcode = 0;56if (argc == 1) { /* Print all env variables */7for (i=0; env_get_char(i) != '\0'; i=nxt+1) {8for (nxt=i; env_get_char(nxt) != '\0'; ++nxt)9 ;10for (k=i; k<nxt; ++k)11 putc(env_get_char(k));12 putc ('\n');1314if (ctrlc()) {15 puts ("\n ** Abort\n");16return1;17 }18 }1920 printf("\nEnvironment size: %d/%ld bytes\n",21 i, (ulong)ENV_SIZE);2223return0;24 }2526for (i=1; i<argc; ++i) { /* print single env variables */27char *name = argv[i];2829 k = -1;3031for (j=0; env_get_char(j) != '\0'; j=nxt+1) {3233for (nxt=j; env_get_char(nxt) != '\0'; ++nxt)34 ;35 k = envmatch((uchar *)name, j);36if (k < 0) {37continue;38 }39 puts (name);40 putc ('=');41while (k < nxt)42 putc(env_get_char(k++));43 putc ('\n');46if (k < 0) {47 printf ("## Error: \"%s\" not defined\n", name);48 rcode ++;49 }50 }51return rcode;52 }uchar env_get_char_memory (int index){if (gd->env_valid) {return ( *((uchar *)(gd->env_addr + index)) );} else {return ( default_environment[index] );}}第⼆个命令:setenv命令对⽤的函数是do_setenv 命令,实际上调⽤的是_do_setenv函数下⾯我们来分析⼀下这个函数int _do_setenv (int flag, int argc, char *argv[]){int i, len, oldval;int console = -1;uchar *env, *nxt = NULL;char *name;bd_t *bd = gd->bd;uchar *env_data = env_get_addr(0);if (!env_data) /* need copy in RAM */return1;name = argv[1];if (strchr(name, '=')) {printf ("## Error: illegal character '=' in variable name \"%s\"\n", name);return1;}/** search if variable with this name already exists*/oldval = -1;for (env=env_data; *env; env=nxt+1) {for (nxt=env; *nxt; ++nxt);if ((oldval = envmatch((uchar *)name, env-env_data)) >= 0)break;}/** Delete any existing definition*/if (oldval >= 0) {/* Check for console redirection */if (strcmp(name,"stdin") == 0) {console = stdin;} else if (strcmp(name,"stdout") == 0) {console = stdout;} else if (strcmp(name,"stderr") == 0) {console = stderr;}if (console != -1) {if (argc < 3) { /* Cannot delete it! */printf("Can't delete \"%s\"\n", name);return1;}/* Try assigning specified device */if (console_assign (console, argv[2]) < 0)return1;#ifdef CONFIG_SERIAL_MULTIif (serial_assign (argv[2]) < 0)return1;#endif}/** Switch to new baudrate if new baudrate is supported*/if (strcmp(argv[1],"baudrate") == 0) {int baudrate = simple_strtoul(argv[2], NULL, 10);int i;for (i=0; i<N_BAUDRATES; ++i) {if (baudrate == baudrate_table[i])break;}if (i == N_BAUDRATES) {printf ("## Baudrate %d bps not supported\n",baudrate);return1;}printf ("## Switch baudrate to %d bps and press ENTER ...\n", baudrate);udelay(50000);gd->baudrate = baudrate;serial_setbrg ();udelay(50000);for (;;) {if (getc() == '\r')break;}}if (*++nxt == '\0') {if (env > env_data) {env--;} else {}} else {for (;;) {*env = *nxt++;if ((*env == '\0') && (*nxt == '\0'))break;++env;}}*++env = '\0';}#ifdef CONFIG_NET_MULTIif (strncmp(name, "eth", 3) == 0) {char *end;int num = simple_strtoul(name+3, &end, 10);if (strcmp(end, "addr") == 0) {eth_set_enetaddr(num, argv[2]);}}#endif/* Delete only ? */if ((argc < 3) || argv[2] == NULL) {env_crc_update ();return0;}/** Append new definition at the end*/for (env=env_data; *env || *(env+1); ++env);if (env > env_data)++env;/** Overflow when:* "name" + "=" + "val" +"\0\0" > ENV_SIZE - (env-env_data)*/len = strlen(name) + 2;/* add '=' for first arg, ' ' for all others */for (i=2; i<argc; ++i) {len += strlen(argv[i]) + 1;}if (len > (&env_data[ENV_SIZE]-env)) {printf ("## Error: environment overflow, \"%s\" deleted\n", name);return1;}while ((*env = *name++) != '\0')env++;for (i=2; i<argc; ++i) {char *val = argv[i];*env = (i==2) ? '=' : '';while ((*++env = *val++) != '\0');/* end is marked with double '\0' */*++env = '\0';/* Update CRC */env_crc_update ();/** Some variables should be updated when the corresponding * entry in the enviornment is changed*/if (strcmp(argv[1],"ethaddr") == 0) {char *s = argv[2]; /* always use only one arg */char *e;for (i=0; i<6; ++i) {bd->bi_enetaddr[i] = s ? simple_strtoul(s, &e, 16) : 0;if (s) s = (*e) ? e+1 : e;}#ifdef CONFIG_NET_MULTIeth_set_enetaddr(0, argv[2]);#endifreturn0;}if (strcmp(argv[1],"ipaddr") == 0) {char *s = argv[2]; /* always use only one arg */char *e;unsigned long addr;bd->bi_ip_addr = 0;for (addr=0, i=0; i<4; ++i) {ulong val = s ? simple_strtoul(s, &e, 10) : 0;addr <<= 8;addr |= (val & 0xFF);if (s) s = (*e) ? e+1 : e;}bd->bi_ip_addr = htonl(addr);return0;}if (strcmp(argv[1],"loadaddr") == 0) {load_addr = simple_strtoul(argv[2], NULL, 16);return0;}#if defined(CONFIG_CMD_NET)if (strcmp(argv[1],"bootfile") == 0) {copy_filename (BootFile, argv[2], sizeof(BootFile));return0;}#endif#ifdef CONFIG_AMIGAONEG3SEif (strcmp(argv[1], "vga_fg_color") == 0 ||strcmp(argv[1], "vga_bg_color") == 0 ) {extern void video_set_color(unsigned char attr);extern unsigned char video_get_attr(void);video_set_color(video_get_attr());return0;#endif /* CONFIG_AMIGAONEG3SE */ return0;}。

设置环境变量的方法

设置环境变量的方法

设置环境变量的方法在计算机系统中,环境变量是一组由操作系统或应用程序设置的动态值,用于存储配置信息或为程序提供运行时所需的数据。

环境变量可以在不同的应用程序之间共享,并对系统的运行状况和行为产生影响。

1.使用操作系统的图形用户界面(GUI)设置环境变量:大多数操作系统提供了图形用户界面来设置环境变量。

以下是在Windows和Mac操作系统中使用GUI设置环境变量的步骤:2.使用命令行界面设置环境变量:命令行界面是一种直接与操作系统交互的方式。

以下是在Windows和Mac操作系统中使用命令行界面设置环境变量的步骤:在Windows操作系统中,可以使用SET命令来设置环境变量。

例如,要设置名为“JAVA_HOME”的环境变量,可以在命令提示符中输入以下命令:```SET JAVA_HOME=C:\Program Files\Java\jdk1.8.0_181```这将设置名为“JAVA_HOME”的环境变量,并将其值设置为“C:\Program Files\Java\jdk1.8.0_181”。

在Mac操作系统中,可以使用export命令来设置环境变量。

例如,要设置名为“JAVA_HOME”的环境变量,可以在终端中输入以下命令:```exportJAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Con tents/Home```这将设置名为“JAVA_HOME”的环境变量,并将其值设置为“/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Ho me”。

3.使用配置文件设置环境变量:有些应用程序或开发环境会提供配置文件来设置环境变量。

例如,在Java开发中,可以使用“.bash_profile”文件或“.bashrc”文件来设置环境变量。

以下是在Mac操作系统中使用“.bash_profile”文件设置环境变量的步骤:```exportJAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Con tents/Home```保存文件并退出。

uboot启动参数,机器码,环境变量

uboot启动参数,机器码,环境变量

uboot启动参数,机器码,环境变量uboot启动参数,机器码,环境变量分类: linux应用 2011-07-05 09:12 217人阅读评论(0) 收藏举报这些都是以前的帖子,现在移动到这里来了,,嘻嘻!!注意的问题总结:1.内核参数传递内核中的参数是内核提供的,在配置内核时指定,而u-boot提供的则在u-boot启动时传递到内核取代内核提供的。

u-boot的参数传递利用了三个通用寄存器R0,R1,R2。

u-boot在启动的过程中把参数放到3个寄存器中,到内核启动时再把寄存器中的参数取出。

一般我们需要通过u-boot/tools/目录下的mkimage制作uImage,使用bootm命令进行加载,注意go命令是不传递内核参数的。

mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image选项:-A:set architecture to 'arch' //用于指定CPU类型,比如ARM-O:set operating system to 'os' //用于指定操作系统,比如Linux-T:set image type to 'type' //用于指定image类型,比如Kernel-C:set compression type 'comp' //指定压缩类型-a:set load address to 'addr' (hex) //指定image的载入地址-e:set entry point to 'ep' (hex) //内核的入口地址,一般为image的载入地址+0x40(信息头的大小)-n:set image name to 'name' //image在头结构中的命名-d:use image data from 'datafile' //无头信息的image文件名-x:set XIP (execute in place) //设置执行位置例如:mkimage -n 'linux-2.6.30.4' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage.img 注意内核的加载地址是内存的起始地址+0x8000,0x40是64k的头部,是mkimage加上去的,0x30008040是内核第一条指令所在的地址。

UBOOT:env(环境变量)

UBOOT:env(环境变量)

UBOOT:env(环境变量)env包含以下⽂件:cmd/nvedit.ccommon/env_common.ccommon/env_flags.ccommon/env_common.cenv_htab为环境变量的哈希表。

uchar env_get_char(int index)返回(gd->env_addr+index)的字符串指针。

common/env_flags.cint env_flags_validate(const ENTRY *item, const char *newval, enum env_op op, int flag)在创建、修改、删除⼀个环境变量时进⾏⼀致性检查的函数。

cmd/Nvedit.cint getenv_f(const char *name, char *buf, unsigned len)在gd->env_addr中查找name=value对,找到则将gd->env_addr中的name对应的值拷贝到buf中,返回拷贝的字符串长度。

char *getenv(const char *name)(1)如果gd->flags & GD_FLG_ENV_READY(已经导⼊env_htab哈希表),以name作为key,在env_htab哈希表⾥查找条⽬(2)未导⼊哈希表,则在gd->env_addr中查找name=value对,找到则返回gd->env_addr中的name对应的值。

ulong getenv_ulong(const char *name, int base, ulong default_val)获取name环境变量对应的value,若有环境变量则转化为base指定的进制数并返回,若没有则返回default_val。

env_default.h定义默认的环境变量default_environment。

env_common.cuchar env_get_char(int index)获取gd->env_addr+index处的字符,若gd->env_valid⽆效,则获取int getenv_yesno(const char *var)查找env_htab哈希表中是否有key=var的条⽬,若有则判断此条⽬的data是不是数值。

uboot的环境变量设置

uboot的环境变量设置

这是我uboot的环境变量设置,在该设置下可以运行initram内核(从内存下载到nandflash 再运行),但是运行nfs根文件系统的时候一直出错,各种错误。

查看了很多资料后猜想应该是uboot传递给linux内核的参数有问题,也就是bootargs的设置有问题。

#printenvbootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 rootfstype=yaffs2 rw mem=64Mbootcmd=nand read 0x32000000 0x60000 0x300000; bootm 0x32000000bootdelay=3baudrate=115200ethaddr=08:00:3e:26:0a:5bipaddr=192.168.1.110serverip=192.168.1.100netmask=255.255.255.0stdin=serialstdout=serialstderr=serialethact=dm9000#setenv ……#saveenv ……#bdinfo 可以查看机器码等信息所以查看资料后就开始对bootargs参数进行设置:因为为了方便对程序测试等工作,使用nfs根文件系统可以在不烧写根文件系统到flash 中完成对程序的测试工作,因此设置bootargs使它支持nfs根文件系统启动。

#setenv bootargs 'root=/dev/nfs rw nfsroot=10.103.4.216:/nfsroot/rootfs ip=10.103.4.211 console=ttySAC0'#saveenv#tftp 31000000 uImage#bootm 31000000启动信息如下:……s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz).s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 198kHz).s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 198kHz).s3c2440-sdi s3c2440-sdi: running at 198kHz (requested: 198kHz).s3c2440-sdi s3c2440-sdi: powered down.eth0: link downIP-Config: Guessing netmask 255.0.0.0IP-Config: Complete:device=eth0, addr=10.103.4.211, mask=255.0.0.0, gw=255.255.255.255,host=10.103.4.211, domain=, nis-domain=(none),bootserver=255.255.255.255, rootserver=10.103.4.216, rootpath=Looking up port of RPC 100003/2 on 10.103.4.216eth0: link up, 10Mbps, half-duplex, lpa 0x0021Looking up port of RPC 100005/1 on 10.103.4.216VFS: Mounted root (nfs filesystem) on device 0:11.Freeing init memory: 128KProcessing /etc/profile... Done#最后实现了内核正常启动,nfs根文件系统成功挂载(此时烧写在nandflash中的initram 根文件系统不能正常启动了,需改回到上面的最初的设置才行)。

uboot环境变量语法

uboot环境变量语法

uboot环境变量语法uboot 是一个常见的嵌入式系统启动程序,它通常用于嵌入式系统的启动和配置。

在uboot 中,环境变量是非常重要的一部分,它们可以用来存储系统配置和在启动时进行动态调整。

环境变量是用来存储在启动时需要的配置信息,例如系统的 IP 地址、MAC 地址、启动命令等信息。

它们可以被系统中的各个组件使用,例如内核、应用程序等。

在 uboot 中,环境变量由键值对组成,由空格、符号、等号等分隔。

例如:bootcmd=run sdboot这里 bootcmd 是环境变量的名称, run sdboot 是它的值。

这一行告诉 uboot 在启动时运行命令 sdboot。

环境变量的设置有几种方式,可以通过 uboot 的菜单界面进行设置,也可以通过uboot 的命令行工具 setenv 进行设置,还可以通过 tftp 或者 flash 进行设置。

环境变量也可以存储在嵌入式设备的 flash 中,以便在下次启动时使用。

在 uboot 中,环境变量有许多语法规则,下面我们将详细介绍。

1. 命名规则环境变量的名称必须是字母、数字或下划线的组合,不能以数字开头。

变量名不区分大小写,但是建议使用大写字母来命名环境变量。

2. 赋值环境变量的值可以是字符串、数字、布尔类型或数组。

字符串可以用单引号或双引号括起来,数字可以用 0x 前缀表示十六进制数,而布尔类型可以用 true 或 false 来赋值。

例如:ipaddr=192.168.1.100netmask=255.255.255.0bootfile='uImage'bootdelay=33. 回显可以使用 printenv 命令来回显环境变量的值。

例如:uboot> printenv ipaddr4. 命令除了普通的值之外,环境变量还可以包含多个命令。

这些命令会在变量被执行时依次执行。

例如:sdboot=''sdboot='mmc rescan;'sdboot='setenv bootargs root=/dev/mmcblk0p1 ro;'sdboot='ext2load mmc 0:1 0x80000000 /boot/uImage;'sdboot='bootm 0x80000000;'这个例子中,bootcmd 命令将调用 sdboot 命令。

uboot学习之七---uboot的环境变量

uboot学习之七---uboot的环境变量

uboot学习之七---uboot的环境变量环境变量的作⽤环境变量的优先级uboot代码当中有⼀个值,环境变量中也有⼀个值。

uboot程序实际运⾏时规则是:如果环境变量为空,则使⽤代码中的值;如果环境变量不为空则优先使⽤环境变量对应的值⽐如machid机器码,uboot在x210_sd.h中定义了⼀个机器码2456,写死在程序中,如果要更改要修改源代码,并且重新编译。

⽐较简单的⽅式是使⽤环境变量machid。

set machid 0x998,有了环境,系统则优先使⽤环境变量中的值。

这就是优先级的问题环境变量在uboot中的⼯作⽅式((1)默认环境变量,在uboot/common/env_common.c中default_environment,这东西本质是⼀个字符数组,⼤⼩为CFG_ENV_SIZE(16kb),⾥⾯内容就是很多个环境变量连续分布组成的,每个环境变量最末端以'\0'结束。

(2)SD卡中环境变量分区,在uboot的raw分区中。

SD卡中其实就是给了个分区,专门⽤来存储⽽已。

存储时其实是把DDR中的环境变量整体的写⼊SD卡中分区⾥。

所以当我们saveenv时其实整个所有的环境变量都被保存了⼀遍,⽽不是只保存更改了的。

(3)DDR中环境变量,在default_environment中,实质是字符数组。

在uboot中其实是⼀个全局变量,链接时在数据段,重定位时default_environment就被重定位到DDR中⼀个内存地址处了。

这个地址处这个全局字符数组就是我们uboot运⾏时的DDR中的环境变量了。

总结:刚烧录的系统中环境变量分区是空⽩的,uboot第⼀次运⾏时加载的是uboot代码中⾃带的⼀份环境变量,叫默认环境变量。

我们在saveenv时DDR中的环境变量会被更新到SD卡中的环境变量中,就可以被保存下来,下次开机会在环境变量relocate时会SD卡中的环境变量会被加载到DDR中去。

uboot环境变量

uboot环境变量

1.相关文件common/env_common.c供u-boot调用的通用函数接口,它们隐藏了env的不同实现方式,比如dataflash, epprom, flash等common/env_dataflash.cenv 存储在dataflash中的实现common/env_epprom.cenv 存储在epprom中的实现common/env_flash.cenv 存储在flash中的实现common/env_nand.cenv 存储在nand中的实现common/env_nvedit.c实现u-boot对环境变量的操作命令environment.c环境变量以及一些宏定义env如果存储在Flash中还需要Flash的支持。

2.数据结构env 在 u-boot 中通常有两种存在方式,在永久性存储介质中( Flash NVRAM 等)在SDRAM,可以配置不使用 env 的永久存储方式,但这不常用。

u-boot 在启动的时候会将存储在永久性存储介质中的 env 重新定位到 RAM 中,这样可以快速访问,同时可以通过saveenv将 RAM 中的 env 保存到永久性存储介质中。

在include/environment.h中定义了表示env的数据结构typedef struct environment_s{unsigned long crc; /* CRC32 over data bytes */#ifdef CFG_REDUNDAND_ENVIRONMENTunsigned char flags; /* active/obsolete flags */#endifunsigned char data[ENV_SIZE]; /* Environment data */} env_t;关于以上结构的说明:crc是u-boot在保存env 的时候加上去的校验头,在第一次启动时一般 crc校验会出错,这很正常,因为这时 Flash中的数据无效。

uboot环境变量实现分析

uboot环境变量实现分析

uboot环境变量实现分析u-boot的环境变量⽤来存储⼀些常常使⽤的參数变量。

uboot希望将环境变量存储在静态存储器中(如nand nor eeprom mmc)。

当中有⼀些也是⼤家经常使⽤。

有⼀些是使⽤⼈员⾃定义的。

更改这些名字会出现错误,以下的表中我们列出了⼀些经常使⽤的环境变量:bootdelay 运⾏⾃⼰主动启动的等候秒数baudrate 串⼝控制台的波特率netmask 以太⽹接⼝的掩码ethaddr 以太⽹卡的⽹卡物理地址bootfile 缺省的下载⽂件bootargs 传递给内核的启动參数bootcmd ⾃⼰主动启动时运⾏的命令serverip 服务器端的ip地址ipaddr 本地ip 地址stdin 标准输⼊设备stdout 标准输出设备stderr 标准出错设备上⾯这些是uboot默认存在的环境变量,uboot本⾝会使⽤这些环境变量来进⾏配置。

我们能够⾃定义⼀些环境变量来供我们⾃⼰uboot驱动来使⽤。

Uboot环境变量的设计逻辑是在启动过程中将env从静态存储器中读出放到RAM中。

之后在uboot下对env的操作(如printenv editenv setenv)都是对RAM中env的操作。

仅仅有在运⾏saveenv时才会将RAM中的env⼜⼀次写⼊静态存储器中。

这样的设计逻辑能够加快对env的读写速度。

基于这样的设计逻辑。

2014.4版本号uboot实现了saveenv这个保存env到静态存储器的命令。

⽽没有实现读取env到RAM的命令。

那我们就来看⼀下uboot中env的数据结构初始化操作怎样实现的。

⼀ env数据结构在include/environment.h中定义了env_t,例如以下:#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT# define ENV_HEADER_SIZE (sizeof(uint32_t) + 1)# define ACTIVE_FLAG 1# define OBSOLETE_FLAG 0#else# define ENV_HEADER_SIZE (sizeof(uint32_t))#endif#define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE)typedef struct environment_s {uint32_t crc; /* CRC32 over data bytes */#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENTunsigned char flags; /* active/obsolete flags */#endifunsigned char data[ENV_SIZE]; /* Environment data */} env_t;CONFIG_ENV_SIZE是我们须要在配置⽂件⾥配置的环境变量的总长度。

[vip专享]Linux内核驱动之Uboot(一)环境变量

[vip专享]Linux内核驱动之Uboot(一)环境变量

一概述Uboot环境变量根据配置文件存在两种定义方式:外部环境变量和内部环境变量外部环境变量指的是将环境变量定义在外部介质上面比如nand flash,nor flash,mmc等等,具体定义在什么外部介质需要根据配置文件的宏CONFIG_ENV_IS_IN_XX来定义比如:#define CONFIG_ENV_IS_IN_MMC 1 :环境变量在MMC卡上面#define CONFIG_ENV_IS_IN_NAND 1 :环境变量在nandflash上面#define CONFIG_ENV_IS_IN_FLASH 1:环境变量在nor flash上面#undef CONFIG_ENV_IS_NO_WHERE :废除内部环境变量的定义内部环境变量指的是定义在uboot镜像里边的环境变量,由于不使用外部环境变量必须在配置文件中间定义宏#define CONFIG_ENV_IS_NO_WHERE二环境变量的类型和用途Uboot环境变量大概包括四种类型的变量(1) 网络方面的环境变量比如serverip ipaddr netmaskgatewayip(2) bootcmd(3) bootargs(4) 杂项类型的比如bootdelay ,baudrate,stdin,stdout1 网络类型的环境变量此方面的环境变量具体包括如下几种serverip 服务器端的ip地址ipaddr 板卡自己的ip地址netmask 网络掩码gatewayip 网关ethaddr 以太网的mac地址网络类型的环境变量主要是为tftp下载文件,挂载nfs根文件系统等网络行为做准备的下面的指令将网络参数都设置好setenv gatewayip 192.168.0.1;setenv netmask 255.255.255.0;setenv ipaddr 192.168.2.2;setenv serverip 192.168.1.1;saveenv2 bootcmdbootcmd是uboot启动完之后自动执行的命令(延时3秒后执行),bootcmd最重要的任务是加载内核到DDR上去,当然内核可能来自不同的介质包括nand ,mmc,网络等等,所以也存在不同类型的bootcmd命令下面介绍几种常用的.nand 中加载内核setenv bootcmd 'nboot 0x81000000 nand0 0x580000;bootm 0x81000000';saveenv;mmc卡加载内核setenv bootcmd 'mmc rescan 0;fatload mmc 0 0x81000000 uImage;bootm 0x81000000';saveenv;tftp网络加载内核setenv bootcmd 'tftpboot 0x81000000192.168.1.108:uImage;bootm0x81000000';saveenv;上面的都是较为简单的bootcmd命令都是从相应的的介质中间读取内核到DDR上,然后bootm(bootm就是cpu跳转到这个地址执行代码),对于上述bootcmd命令必须有bootargs环境变量的配合,这样内核起来之后能够正确挂载文件系统同时获得来自uboot传给内核的参数较为复杂的如下setenv bootcmd 'mmc rescan 0;fatload mmc 0 0x80900000boot.scr;source 0x80900000';saveenv或者是如下setenv bootcmd 'tftpboot 0x80900000 192.168.4.51:boot.scr;source0x80900000';saveenv上述bootcmd命令使用的是脚本方式,也就是说从外部介质中间读入boot.scr的uboot脚本,然后uboot解析该脚本.由于是执行的脚本,其中可以嵌入较多的命令,可以进行较多的操作包括加载内核,设置bootargs环境变量对于使用脚本的bootcmd,我们去设置bootargs可能会不起作用,因为uboot脚本中可能也存在设置bootargs的命令,这样就会替换我们自己设置的bootargs假如不想要使用boot.scr也可以使用上面的bootcmd来代替。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

u-boot的环境变量u-boot的环境变量是使用u-boot的关键,它可以由你自己定义的,但是其中有一些也是大家经常使用,约定熟成的,有一些是u-boot 自己定义的,更改这些名字会出现错误,下面的表中我们列出了一些常用的环境变量:上面只是一些最基本的环境变量,请注意,板子里原本是没有环境变量的,u-boot的缺省情况下会有一些基本的环境变量,在你执行了saveenv之后,环境变量会第一次保存到flash中,之后你对环境变量的修改,保存都是基于保存在flash中的环境变量的操作。

U-boot的环境变量值得注意的有两个:bootcmd 和bootargs◆b o o t c m d前面有说过bootcmd是自动启动时默认执行的一些命令,因此你可以在当前环境中定义各种不同配置,不同环境的参数设置,然后设置bootcmd为你经常使用的那种参数。

◆b o o t a r g sbootargs是环境变量中的重中之重,甚至可以说整个环境变量都是围绕着bootargs来设置的。

bootargs的种类非常非常的多,我们平常只是使用了几种而已,感兴趣的可以看看这篇文章说的很全:/u2/79570/showart_1675071.html。

bootargs非常的灵活,内核和文件系统的不同搭配就会有不同的设置方法,甚至你也可以不设置bootargs,而直接将其写到内核中去(在配置内核的选项中可以进行这样的设置),正是这些原因导致了bootargs使用上的困难。

下面介绍一下bootargs常用参数,bootargs的种类非常的多,而且随着kernel的发展会出现一些新的参数,使得设置会更加灵活多样。

A.r o o t用来指定r o o t f s的位置,常见的情况有:root=/dev/ram rwroot=/dev/ram0 rw请注意上面的这两种设置情况是通用的,我做过测试甚至root=/dev/ram1 rw和root=/dev/ram2 rw也是可以的,网上有人说在某些情况下是不通用的,即必须设置成ram或者ram0,但是目前还没有遇到,还需要进一步确认,遇到不行的时候可以逐一尝试。

root=/dev/m t d x rwroot=/dev/m t d b l o c k x rwroot=/dev/mtdblock/x rwroot=31:0x上面的这几个在一定情况下是通用的,当然这要看你当前的系统是否支持,不过m t d是字符设备,而m t d b l o c k是块设备,有时候你的挨个的试到底当前的系统支持上面那种情况下,不过root=/dev/mtdblockx rw比较通用。

此外,如果直接指定设备名可以的话,那么使用此设备的设备号也是可以的。

root=/dev/nfs在文件系统为基于nfs的文件系统的时候使用。

当然指定root=/dev/nfs之后,还需要指定nfsroot=serverip:nfs_dir,即指明文件系统存在那个主机的那个目录下面。

B.r o o t f s t y p e这个选项需要跟root一起配合使用,一般如果根文件系统是ext2的话,有没有这个选项是无所谓的,但是如果是jffs2,squashfs等文件系统的话,就需要rootfstype指明文件系统的类型,不然会无法挂载根分区.C.c o n s o l e1. console=tty<n> 使用虚拟串口终端设备<n>.2. console=ttyS<n>[,options]使用特定的串口<n>,options可以是这样的形式bbbbp n x,这里bbbb是指串口的波特率,p是奇偶校验位,n是指的b i t s。

3. console=ttySAC<n>[,options]同上面。

看你当前的环境,有时用ttyS<n>,有时用ttySAC<n>,网上有人说,这是跟内核的版本有关,2.4用ttyS<n>,2.6用ttySAC<n>,但实际情况是官方文档中也是使用ttyS<n>,所以应该是跟内核版本没有关联的。

可以查看Documentation/serial-console.txt找到相关描述。

D.m e mmem=xxM 指定内存的大小,不是必须的。

E.r a m d i s k_s i z eramdisk=xxxxx 不推荐ramdisk_size=xxxxx 推荐上面这两个都可以告诉ramdisk 驱动,创建的ramdisk的size,默认情况下是4m(s390默认8M),你可以查看Documentation/ramdisk.txt 找到相关的描述,不过ramdisk=xxxxx在新版的内核都已经没有提了,不推荐使用。

F.i n i t rd,n o i n i t r d当你没有使用r am d isk启动系统的时候,你需要使用noinitrd这个参数,但是如果使用了的话,就需要指定i n i t r d=r_a d d r,s i z e,r_a d d r 表示initrd在内存中的位置,size表示initrd的大小。

G.i n i tinit指定的是内核启起来后,进入系统中运行的第一个脚本,一般i n i t=/l i n u x r c, 或者i n i t=/e t c/p r e i n i t,preinit的内容一般是创建console,null设备节点,运行init程序,挂载一些文件系统等等操作。

请注意,很多初学者以为init=/linuxrc是固定写法,其实不然,/linuxrc 指的是/目录下面的linuxrc脚本,一般是一个连接罢了。

H.m t d p a r t smtdparts=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 parsingmtdparts的格式如下:mtdparts=<mtddef>[;<mtddef]<mtddef> := <mtd-id>:<partdef>[,<partdef>]<partdef> := <size>[@offset][<name>][ro]<mtd-id> := unique id used in mapping driver/device<size> := standard linux memsize OR "-" to denote all remaining space <name> := (NAME)因此你在使用的时候需要按照下面的格式来设置:mtdparts=mtd-id:<size1>@<offset1>(<name1>),<size2>@<offset2>(<na me2>)这里面有几个必须要注意的:a. mtd-id 必须要跟你当前平台的flash的mtd-id一致,不然整个mtdparts会失效。

b. size在设置的时候可以为实际的size(xxM,xxk,xx),也可以为'-'这表示剩余的所有空间。

举例:假设flash 的mtd-id是sa1100,那么你可以使用下面的方式来设置:mtdparts=sa1100:- →只有一个分区mtdparts=sa1100:256k(ARMboot)ro,-(root) →有两个分区可以查看drivers/mtd/cmdlinepart.c中的注释找到相关描述。

I.i p指定系统启动之后网卡的ip地址,如果你使用基于nfs的文件系统,那么必须要有这个参数,其他的情况下就看你自己的喜好了。

设置ip 有两种方法:ip = ip addrip=i p addr:s e r v e r i p addr:g a t e w a y:n e t m a s k::which netcard:off这两种方法可以用,不过很明显第二种要详细很多,请注意第二种中which netcard 是指开发板上的网卡,而不是主机上的网卡。

经常使用的几种组合:1). 假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下:setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’2). 假设文件系统是ramdisk,且在f l a s h中,bootargs的设置应该如下:setenv bootargs ‘mem=32M console=ttyS0,115200 root=/dev/ram rwinit=/linuxrc’注意这种情况下你应该要在b o o t m命令中指定r a m d i s k在flash中的地址,如bootm k e r n e l_addr r a m d i s k_addr (fdt_addr)3). 假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下setenv bootargs ‘mem=32M console=ttyS0,115200 no initrd root=/dev/mtdblock2 rw r o o t f s t y p e=j f f s2init=/linuxrc’4). 假设文件系统是基于nfs的,bootargs的设置应该如下setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfsip=192.168.0.5:192.168.0.3:192.168.0.3:255.255.255.0::e t h0:o f f’或者se tenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5’上面就是我们经常使用的几种bootargs的组合,老实说,bootargs非常非常的灵活,所以设置的方法有很多中形式,具体的还应该根据你的平台具体的情况来设置。

相关文档
最新文档