如何修改uboot的环境变量env的值来指定uImage的名字
来源:互联网 发布:金蝶软件经销商 编辑:程序博客网 时间:2024/04/30 15:15
今天继续玩基于uboot的nfs。昨天总算是基本搞清了make zImage和make uImage的区别,那么今天就来实际编译几个玩一玩。
不过,在利用mkimage工具对zImage镜像文件加工完、生成了符合uboot格式的uImage镜像文件之后,我突然意识到,此时的镜像文件,已经完完全全是名副其实的uboot格式了,那么此时再将其称为zImage.img,其实已经是不合适的,应该改名为uImage.img才对。也就是说,我在(make zImage和make uImage的区别和mkimage工具的使用)博客中引用的tekkaman前辈的下面这条命令:
mkimage -n 'tekkaman' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img
其实应该是有瑕疵的。应该要将其中的zImage.img改为uImage.img才对。如下:
mkimage -n 'tekkaman' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage.img
于是,我将镜像文件改名,复制到nfs目录下,然后启动开发板。却发现,开发板中的uboot不认uImage.img的名字,它只认zImage.img,引导内核失败,要修改一下。
一开始我尝试通过修改uboot的源代码的方法来做,修改mini2440.h头文件中的相关宏的定义:
#define CONFIG_BOOTCOMMAND "nfs 0x30008000 192.168.100.120:/opt/FriendlyARM/mini2440/rootfs/uImage.img;bootm"
修改完后使用super-vivi将uboot烧录进去,重启开发板,却发现问题仍然存在。这是为什么呢?
经过一番思索,我找到原因了。这是因为uboot已经将zImage.img这个名字写入了它的环境变量中。光修改上面的宏是没有用的,必须修改它的环境变量,否则它不会接受这个新的名字。
可是,要如何来修改它的环境变量呢?网上百度,也没度到什么对应的资料,看来还得自己去摸索。好在uboot提供了一整套方便使用的命令。直接在uboot启动时,敲击键盘进入它的命令行模式,输入help命令便可以看到,如下所示:
[u-boot@MINI2440]# help? - alias for 'help'askenv - get environment variables from stdinbase - print or set address offsetbdinfo - print Board Info structurebmp - manipulate BMP image databoot - boot default, i.e., run 'bootcmd'bootd - boot default, i.e., run 'bootcmd'bootelf - Boot from an ELF image in memorybootm - boot application image from memorybootp - boot image via network using BOOTP/TFTP protocolbootvx - Boot vxWorks from an ELF imagecmp - memory compareconinfo - print console devices and informationcp - memory copycrc32 - checksum calculationdate - get/set/reset date & timedcache - enable or disable data cachedhcp - boot image via network using DHCP/TFTP protocolecho - echo args to consoleeditenv - edit environment variableeeprom - EEPROM sub-systemerase - erase FLASH memoryexit - exit scriptfalse - do nothing, unsuccessfullyfatinfo - print information about filesystemfatload - load binary file from a dos filesystemfatls - list files in a directory (default /)flinfo - print FLASH memory informationfsinfo - print information about filesystemsfsload - load binary file from a filesystem imagego - start application at address 'addr'help - print command description/usagei2c - I2C sub-systemicache - enable or disable instruction cacheiminfo - print header information for application imageimls - list all images found in flashimxtract- extract a part of a multi-imageitest - return true/false on integer compareloadb - load binary file over serial line (kermit mode)loads - load S-Record file over serial lineloadx - load binary file over serial line (xmodem mode)loady - load binary file over serial line (ymodem mode)loop - infinite loop on address rangels - list files in a directory (default /)md - memory displaymm - memory modify (auto-incrementing address)mmc - MMC sub-systemmtest - simple RAM read/write testmw - memory write (fill)nand - NAND sub-systemnboot - boot from NAND devicenfs - boot image via network using NFS protocolnm - memory modify (constant address)ping - send ICMP ECHO_REQUEST to network hostprintenv- print environment variablesprotect - enable or disable FLASH write protectionrarpboot- boot image via network using RARP/TFTP protocolreginfo - print register informationreset - Perform RESET of the CPUrun - run commands in an environment variablesaveenv - save environment variables to persistent storagesetenv - set environment variablesshowvar - print local hushshell variablessleep - delay execution for some timesource - run script from memorytest - minimal test like /bin/shtftpboot- boot image via network using TFTP protocoltrue - do nothing, successfullyunzip - unzip a memory regionusb - USB sub-systemusbboot - boot from USB deviceusbslave- usbslave - get file from host(PC)version - print monitor version
找到其中与环境变量env相关的命令。一个是打印当前的环境变量的命令printenv,一个是修改环境变量的命令editenv,还有一个是保存环境变量到存储器的命令saveenv。一个一个的用起来吧。
1、首先把当前的环境变量env的值打印出来。如下:
[u-boot@MINI2440]# printenvbootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.100.120:/opt/FriendlyARM/mini2440/rootfs ip=192.168.100.230:192.168.100.120:192.168.100.1:255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64Mbootcmd=nfs 0x30008000 192.168.100.120:/opt/FriendlyARM/mini2440/rootfs/zImage.img;bootmbootdelay=10baudrate=115200ethaddr=08:08:11:18:12:27ipaddr=192.168.100.230serverip=192.168.100.120gatewayip=192.168.100.1netmask=255.255.255.0tekkaman=bmp d 70000 stdin=serialstdout=serialstderr=serialethact=dm9000Environment size: 515/131068 bytes
可以看到,变量bootcmd的值,确实是zImage.img。那么接下来我们就要修改这个参数就好。使用editenv这个命令,如下:
[u-boot@MINI2440]# editenv bootcmdedit: nfs 0x30008000 192.168.100.120:/opt/FriendlyARM/mini2440/rootfs/uImage.img;bootm
修改完后记得手动保存一下,否则uboot是不会自动将你的修改动作存入存储器的,一重启就丢失了,白弄了。如下:
[u-boot@MINI2440]# saveenv Saving Environment to NAND...Erasing Nand...Erasing at 0x7c00000000002 -- 0% complete.Writing to Nand... done
OK,修改完成了。如果不太放心有没有修改成功,那么我们再将此刻最新的环境变量值打印出来看看吧,如下:
[u-boot@MINI2440]# printenvbootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.100.120:/opt/FriendlyARM/mini2440/rootfs ip=192.168.100.230:192.168.100.120:192.168.100.1:255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64Mbootdelay=10baudrate=115200ethaddr=08:08:11:18:12:27ipaddr=192.168.100.230serverip=192.168.100.120gatewayip=192.168.100.1netmask=255.255.255.0tekkaman=bmp d 70000 stdin=serialstdout=serialstderr=serialethact=dm9000bootcmd=nfs 0x30008000 192.168.100.120:/opt/FriendlyARM/mini2440/rootfs/uImage.img;bootmEnvironment size: 515/131068 bytes
可以看到,变量bootcmd的值,已经成功修改为了uImage.img。OK,此时可以放心的重启了,输入reset命令就好!
uboot重启完后,可以看到,顺利的按照新的路径和文件名定位到内核文件,成功的引导了系统启动!
搞定,收工!
- 如何修改uboot的环境变量env的值来指定uImage的名字
- Linux如何修改env看到的环境变量? .bashrc和.bash_profile区别
- CGI的环境变量(env)
- uboot支持uImage格式的内核
- uboot启动uImage与zImage的区别
- 如何修改回收站的名字
- uboot环境变量的讲解
- uboot - 环境变量的同步
- uboot的环境变量
- uboot常用的环境变量
- uboot的环境变量
- UBOOT的环境变量
- uboot的环境变量操作
- uboot环境变量的讲解
- 2通过程序获得环境变量,getenv(),setenv()函数和unsetenv()函数,env查看环境变量,echo输出指定的环境变量
- php框架Laravel如何友好的修改.env配置文件详解
- 关于linux操作系统的环境变量(env)
- 关于linux操作系统的环境变量(env)
- IT行业哪个方向更有前途
- python小试牛刀之一
- 输入一个字符串,计算字符串中子串出现的次数
- 1003.Emergency (25)
- Spring注解整理
- 如何修改uboot的环境变量env的值来指定uImage的名字
- PHP 精度计算引发的灾难性Bug
- Xcode只能选择My Mac无法选择模拟器解决
- OpenCV实践(6)- 离散傅里叶变换
- LintCode 17-子集 JAVA
- http协议详解
- Linux系统启动那些事—基于Linux 3.10内核
- 1015: [JSOI2008]星球大战starwar
- (转)设计模式读书笔记-----简单工厂模式