经典=Uboot-2-命令详解(bootm)
U-boot命令分析报告

Uboot命令的解释及添加方法Baods2012.03.22一、分析uboot命令的执行过程在uboot启动的第二段代码start_armboot函数最后面会进入死循环,在这个死循环中调用main_loop函数,其中main_loop函数在common/main.c中定义在这里面查看是否设置环境变量参数,如果设置了则看串口在bootdelay秒内有没有输入,若没有则执行bootcmd命令/****************************************************************************/ void main_loop(void){......#if defined(CONFIG_BOOTDELAY)&&(CONFIG_BOOTDELAY>=0)char*s;int bootdelay;#endif....../**在这里获得环境变量参数bootdelay,如果环境变量中有定义,则将值赋给bootdelay,*没有则赋值给CONFIG_BOOTDELAY.*/#if defined(CONFIG_BOOTDELAY)&&(CONFIG_BOOTDELAY>=0)s=getenv("bootdelay");bootdelay=s?(int)simple_strtol(s,NULL,10):CONFIG_BOOTDELAY;debug("###main_loop entered:bootdelay=%d\n\n",bootdelay);......s=getenv("bootcmd");获取bootcmddebug("###main_loop:bootcmd=\"%s\"\n",s?s:"<UNDEFINED>");if(bootdelay>=0&&s&&!abortboot(bootdelay)){run_command(s,0);/*执行bootcmd中的命令*/....../*Main Loop for Monitor Command Processing*/#ifdef CFG_HUSH_PARSERparse_file_outer();/*This point is never reached*/for(;;);#elsefor(;;){len=readline(CFG_PROMPT);/*首先显示CFG_PROMPT定义的字符串"U-boot>"然后等待键盘输入....之后对一些特别字符进行处理,对于正常字符将存放到console_buffer中*/flag=0;/*assume no special flags for now*/if(len>0)strcpy(lastcommand,console_buffer);else if(len==0)flag|=CMD_FLAG_REPEAT;#ifdef CONFIG_BOOT_RETRY_TIMEelse if(len==-2){/*返回值等于-2则timeout*/puts("\nTimed out waiting for command\n");#ifdef CONFIG_RESET_TO_RETRY/*Reinit board to run initialization code again*/do_reset(NULL,0,0,NULL);#elsereturn;/*retry autoboot*/#endif}#endifif(len==-1)/*返回值等于-1则break*/puts("<INTERRUPT>\n");elserc=run_command(lastcommand,flag);读取到命令后交给run_command处理if(rc<=0){/*invalid command or not repeatable,forget it*/lastcommand[0]=0;}}#endif/*CFG_HUSH_PARSER*/}接下来看看run_command函数做了什么工作?int run_command(const char*cmd,int flag){cmd_tbl_t*cmdtp;char cmdbuf[CFG_CBSIZE];/*working copy of cmd*/char*str=cmdbuf;......clear_ctrlc();/*forget any previous Control C*/if(strlen(cmd)>=CFG_CBSIZE){/*判断输入的命令是否太长*/ puts("##Command too long!\n");return-1;}strcpy(cmdbuf,cmd);/*复制命令到cmdbuf*//*Process separators and check for invalid repeatable commands*/ while(*str){/*char*str=cmdbuf*//**Find separator,or string end*Allow simple escape of';'by writing"\;"*/for(inquotes=0,sep=str;*sep;sep++){if((*sep=='\'')&&(*(sep-1)!='\\'))inquotes=!inquotes;if(!inquotes&&(*sep==';')&&/*separator*/(sep!=str)&&/*past string start*/(*(sep-1)!='\\'))/*and NOT escaped*/break;}/*Limit the token to data between separators*/token=str;if(*sep){str=sep+1;/*start of command for next pass*/*sep='\0';}elsestr=sep;/*no more commands for next pass*//*find macros in this token and replace them*/process_macros(token,finaltoken);/*Extract arguments*/if((argc=parse_line(finaltoken,argv))==0){rc=-1;/*no command at all*/continue;}/*这里调用到了find_cmd函数,查找命令表、进入一个命令*/if((cmdtp=find_cmd(argv[0]))==NULL){printf("Unknown command'%s'-try'help'\n",argv[0]);rc=-1;/*give up after bad command*/continue;}if(argc>cmdtp->maxargs){/*检查最大的参数变量*/printf("Usage:\n%s\n",cmdtp->usage);rc=-1;continue;}#if(CONFIG_COMMANDS&CFG_CMD_BOOTD)/*avoid"bootd"recursion*/if(cmdtp->cmd==do_bootd){#ifdef DEBUG_PARSERprintf("[%s]\n",finaltoken);#endifif(flag&CMD_FLAG_BOOTD){puts("'bootd'recursion detected\n");rc=-1;continue;}else{flag|=CMD_FLAG_BOOTD;}}#endif/*CFG_CMD_BOOTD*//*OK接下来调用cmd_tbl_t结构体中注册的cmd函数*/if((cmdtp->cmd)(cmdtp,flag,argc,argv)!=0){rc=-1;}repeatable&=cmdtp->repeatable;/*Did the user stop this?*/if(had_ctrlc())return0;/*if stopped then not repeatable*/}return rc?rc:repeatable;}从上面的分析知道XXX命令的执行过程如下:1.在U-Boot中输入“XXX”命令执行时,U-Boot接收输入的字符串“XXX”,然后传递给run_command函数;2.run_command函数调用find_cmd函数在__u_boot_cmd_start与__u_boot_cmd_end间查找命令,并返回“XXX”命令的cmd_tbl_t结构;3.run_command函数使用返回的cmd_tbl_t结构中的函数指针调用“XXX”命令的响应函数“do_XXX”,从而完成了命令的执行。
UBoot操作和常用命令

UBoot常用命令
• usb start: 起动usb 功能 • usb info: 列出设备 • usb scan: 扫描usb storage(u 盘)设备 • f的at文ls:件列出DOS FAT文件系统, 如:fatls usb 0列出第一块U盘中 • fatload: 读入FAT中的一个文件,如:fatload usb 0 0x30000000
• 通常,Boot Loader 是严重地依赖于硬件而实现的, 特别是在嵌入式世界。因此,在嵌入式世界里建 立一个通用的Boot Loader 几乎是不可能的。尽管 如此,我们仍然可以对Boot Loader 归纳出一些通 用的概念来,以指导用户特定的Boot Loader 设计 与实现。
UBoot来源
• nand write [内存地址] [NAND地址] [大小]
– 将SDRAM中地址0x31000000中大小为0x00200000的内容写入NAND Flash的0x100000地址。
– nand write 0x31000000 0x00100000 0x00200000 – NAND write: device 0 offset 1048576, size 2097152 ... 2097152 bytes
Creating 5 MTD partitions on "NAND 256MiB 3,3V 8-bit": 0x000000000000-0x000000040000 : "supervivi" ftl_cs: FTL header not found. 0x000000040000-0x000000060000 : "param" uncorrectable error : 0x000000060000-0x000000560000 : "Kernel" ftl_cs: FTL header not found. 0x000000560000-0x000040560000 : "root" mtd: partition "root" extends beyond the end of device "NAND 256MiB 3,3V 8-bit" -- size truncated to 0xfaa0000 ftl_cs: FTL header not found. 0x000000000000-0x000040000000 : "nand" mtd: partition "nand" extends beyond the end of device "NAND 256MiB 3,3V 8-bit" -- size truncated to 0x10000000
uboot笔记uboot命令分析+实现

uboot笔记uboot命令分析+实现uboot笔记:uboot命令分析+实现Ubootuboot命令分析+实现先贴⼀个重要结构,位于uboot/include/command.h,这个结构代表每个uboot命令struct cmd_tbl_s {char *name; /* Command Name */int maxargs; /* maximum number of arguments*/int repeatable;/* autorepeat allowed? *//* Implementation function */int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);char *usage; /* Usage message (short)简短⽤法信息*/#ifdef CFG_LONGHELPchar *help; /* Help message (long) 长的帮助信息*/#endif#ifdef CONFIG_AUTO_COMPLETE/* do auto completion on the arguments */ int (*complete)(intargc, char *argv[], charlast_char, intmaxv, char *cmdv[]); #endif};typedefstruct cmd_tbl_s cmd_tbl_t;============================================================uboot的第⼀阶段:硬件相关初始化0.reset执⾏arm920t/start.s 过程如下1.设置cpu svc管理模式2.关看门狗中断,mmu等3.设置时钟,sdram,外部总线4.代码重定位,搬运代码,从flash到sdram5.设置栈,bss段清零, bss⽤于未初始化的全局变量和静态变量6.ldr pc, _start_armboot即进⼊uboot启动的第⼆阶段,调⽤c函数start_armboot()从start_armboot开始经过⼀系列外设初始化⽐如falsh_initnand_init...最后循环调⽤mian_loop()main_loop主要流程{1. ⽣成环境变量mtdparts, 调⽤mtdparts_init2. 在启动过程中若⽆空格键按下则boot_zImage,即run_command(getenv("bootcmd"),0)有空格键按下则run_command("menu",0)3. shell过程,读取⽤户的输⼊并执⾏相应的命令{从控制台获得命令,保存在全局变量comsole_buffer中解析命令⾏字符串,分割命令与参数,最后执⾏run_command(...); }}也就是说在mian_loop中,是处理环境变量和控制台⼈机交互,mian_loop调⽤readline ()读取命令⾏到console_buffer,再把console_buffer复制到lastcommand中去,还要设置flag,最后调⽤run_command (lastcommand, flag)函数,run_command (lastcommand, flag)函数中,⾸先定义cmd_tbl_t *cmdtp,再解析命令⾏。
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 处。
bootm命令参数

bootm命令参数(原创版)目录1.bootm 命令参数概述2.常见 bootm 命令参数及其功能3.使用 bootm 命令参数的注意事项正文【1.bootm 命令参数概述】bootm 命令是在 Linux 系统中用于启动和管理内存映射(镜像)的工具,通常用于启动 Linux 内核。
bootm 命令的参数丰富,功能强大,能够满足不同场景下启动和管理内存映射的需求。
【2.常见 bootm 命令参数及其功能】以下是一些常见的 bootm 命令参数及其功能:- -f:指定内核映像文件的路径。
例如:bootm -f /boot/linux.img - -F:指定内核映像文件的格式。
例如:bootm -F extable -f elf_i386-m 0x8000 -L 0x00000000其中,extable 表示文件格式为 extable,elf_i386 表示内核类型为 i386,-m 0x8000 指定内核映像文件从 0x8000 地址开始,-L0x00000000 指定内核映像文件的长度。
- -A:指定启动参数。
例如:bootm -A 0x00000001 -A 0x00000002 其中,0x00000001 和 0x00000002 分别为两个启动参数。
- -s:指定内核启动方式。
例如:bootm -s 0x0000其中,0x0000 表示内核启动方式为直接启动。
- -c:指定内核压缩方式。
例如:bootm -c gzip其中,gzip 表示内核采用 gzip 压缩方式。
【3.使用 bootm 命令参数的注意事项】在使用 bootm 命令参数时,请注意以下几点:- 确保内核映像文件的路径、格式、地址和长度等参数正确无误,以免导致启动失败。
- 启动参数的值需要根据实际情况进行设置,部分参数的值可能需要查阅相关文档或向专业人士咨询。
- 选择合适的内核启动方式,以确保系统能够正常运行。
- 根据内核映像文件的实际情况选择合适的压缩方式。
bootm命令参数

bootm命令参数摘要:一、bootm 命令简介1.概述2.用途二、bootm 命令参数详解1.参数格式2.参数说明a.启动模式b.设备类型c.镜像文件d.启动菜单三、bootm 命令使用示例1.示例一2.示例二3.示例三四、bootm 命令常见问题及解答1.问题一2.问题二3.问题三正文:bootm 命令是Linux 系统中的一个重要命令,用于启动管理器,它能够根据指定的参数来启动不同的操作系统或者加载不同的镜像文件。
在使用bootm 命令时,需要了解其参数的含义和使用方法,以便正确地实现操作系统的启动。
一、bootm 命令简介bootm 命令是Linux 系统中的一个命令,主要用于启动管理器。
用户可以通过该命令来选择要启动的操作系统或者加载镜像文件。
bootm 命令具有很强的灵活性,可以满足多种不同的启动需求。
二、bootm 命令参数详解1.参数格式bootm [选项] [设备] [镜像文件] [启动菜单]2.参数说明a.启动模式-s: 表示单用户模式-b: 表示带网络引导菜单的多用户模式-c: 表示命令行模式-d: 表示诊断模式-v: 表示详细模式b.设备类型-m: 表示内存设备-c: 表示磁盘设备-s: 表示串行设备c.镜像文件-f: 表示镜像文件d.启动菜单-M: 表示启动菜单三、bootm 命令使用示例1.示例一在单用户模式下启动Linux 系统:```bootm -s```2.示例二在带网络引导菜单的多用户模式下启动Linux 系统:```bootm -b```3.示例三在命令行模式下启动Linux 系统:```bootm -c```四、bootm 命令常见问题及解答1.问题一:在使用bootm 命令时,如何选择启动模式?解答:用户可以根据实际需求,通过选项-s、-b、-c、-d、-v 来选择不同的启动模式。
2.问题二:在使用bootm 命令时,如何选择设备类型?解答:用户可以通过选项-m、-c、-s 来选择不同的设备类型。
u-boot命令介绍
U-BOOT 命令的介绍U-BOOT 常用命令通常使用help(或者?)来查看所有的U-BOOT 命令,列出在当前配置下所有支持的命令。
但是我们要注意,尽管U-BOOT 提供了很多配置选项,并不是所有选项都支持各种处理器和开发板,有些选项可能在你的配置中并没有被选上。
1 获得帮助信息红色部分是我们常用的一些命令,重点掌握,其它的可以了解一下。
通过help 可以获得当前开发板的U-BOOT 中支持的命令.FS2410 # help? - alias for 'help'autoscr - run script from memorybase - print or set address offsetbdinfo - print Board Info structureboot - 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 cacheecho - echo args to consoleerase - erase NOR FLASH memoryflinfo - print FLASH memory informationgo - start application at address 'addr'help - print online helpicache - enable or disable instruction cacheiminfo - print header information for application imageimls - list all images found in flashitest - return true/false on integer compareloadb - load binary file over serial line (kermit mode)loads - load S-Record file over serial lineloop - infinite loop on address rangemd - memory displaymm - memory modify (auto-incrementing)mtest - simple RAM 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 protocolreset - Perform RESET of the CPUrun - run commands in an environment variablesaveenv - save environment variables to persistent storagesetenv - set environment variablessleep - delay execution for some timetftpboot - boot image via network using TFTP protocolversion - print monitor version2 常用命令使用说明2.1 askenv(F)在标准输入(stdin)获得环境变量。
uboot常用的命令
uboot常用的命令
U-Boot是一款开源的引导加载程序,它是嵌入式系统中常用的引导加载程序之一。
U-Boot提供了一系列的命令,可以用来进行系统的启动、调试、烧写等操作。
下面是U-Boot常用的命令:
1. help:显示所有可用的命令列表。
2. printenv:显示环境变量的值。
3. setenv:设置环境变量的值。
4. saveenv:保存环境变量的值。
5. bootm:启动内核。
6. tftpboot:从TFTP服务器下载文件。
7. ping:测试网络连接。
8. md:以16进制格式显示内存内容。
9. mw:以16进制格式写入内存内容。
10. cp:复制内存内容。
11. fatload:从FAT文件系统中加载文件。
12. fatls:列出FAT文件系统中的文件。
13. mmc:MMC卡操作命令。
14. usb:USB操作命令。
15. dhcp:获取IP地址。
16. run:执行脚本。
17. reset:重启系统。
以上是U-Boot常用的命令,这些命令可以满足大部分的需求。
在实
际使用中,我们可以根据具体的需求来选择合适的命令。
如果需要更
多的命令,可以通过添加自定义命令的方式来扩展U-Boot的功能。
总之,U-Boot是一款非常强大的引导加载程序,它提供了丰富的命令,
可以用来进行系统的启动、调试、烧写等操作。
熟练掌握U-Boot的命令,可以提高嵌入式系统的开发效率。
bootm命令参数
bootm命令参数(原创实用版)目录1.概述 bootm 命令2.bootm 命令的参数3.参数的使用方法和示例4.常见问题和解决方法正文bootm 命令是 Linux 系统中用于引导内存棒的命令,它可以将内存棒中的 Linux 内核和初始化程序加载到内存中,并启动 Linux 系统。
在使用 bootm 命令时,需要了解其参数的使用方法,以便正确地引导内存棒。
1.概述 bootm 命令bootm 命令是 Linux 系统中的一个实用程序,主要用于引导内存棒。
它可以将内存棒中的 Linux 内核和初始化程序加载到内存中,并启动Linux 系统。
bootm 命令通常用于嵌入式系统或实时操作系统,这些系统通常使用内存棒作为引导设备。
2.bootm 命令的参数bootm 命令有多个参数,这些参数用于指定内存棒的类型、设备文件、内核和初始化程序等。
以下是 bootm 命令的一些常用参数:- -d:指定内存棒的设备文件。
- -f:指定内存棒中的文件系统类型。
- -k:指定内核的压缩方式。
- -l:指定内核的启动选项。
- -m:指定内存棒的类型。
- -s:指定内核的引导参数。
- -v:显示详细的输出信息。
3.参数的使用方法和示例以下是使用 bootm 命令的一些示例:- 引导一个名为"my_kernel"的内核,并使用"my_root_fs"作为文件系统:```bootm -d /dev/mmcblk0p2 -f ext3 -k gzip -l my_kernel -m 128M -s my_root_fs```- 引导一个名为"my_kernel"的内核,并使用"my_root_fs"作为文件系统,同时显示详细的输出信息:```bootm -d /dev/mmcblk0p2 -f ext3 -k gzip -l my_kernel -m 128M -s my_root_fs -v```4.常见问题和解决方法在使用 bootm 命令时,可能会遇到一些问题,例如内存棒无法识别、内核无法引导等。
uboot的常用命令及用法
uboot的常⽤命令及⽤法uboot是bootloader的⼀种,主要是⽤于引导内核启动.uboot除此功能外, 还带有很多其它功能. 功能是通过命令来调⽤.uboot的命令:help //列出当前uboot所有⽀持的命令help 命令 //查看指定命令的帮助reset //重启ubootbootm //⽤于启动内核⽤法: bootm 0x42000000 //从内存地址0x42000000启动内核, 启动前需把内核镜像uImage存放到指定的内存地址printenv //打印所有环境变量的值printenv 环境变量名 //查看指定的环境变量值常⽤环境变量:bootdelay // uboot启动后, 倒计时多少秒后⾃动执⾏环境变量bootcmd的语句bootcmd // 倒计时到0后,⾃动执⾏⾥⾯的语句bootargs // 是⽤于提供给内核的启动参数语句setenv //设置/修改/删除环境变量的值⽤法:setenv 环境变量名 //删除指定的环境变量setenv myargs "hello" //设置环境变量myargs=hello, 如果环境变量没有会创建出来,如果已存则会修改它的值saveenv //保存环境变量,环境变量修改过后必须执⾏此命令才可以保存起来,否则重启后环境变量就恢复了.loady //⽤于从uart线下载⽂件到板上内存⾥(loadb, loads, loadx基本⼀样) ⽤法:loady 0x40008000 //把下载的⽂件从内存地址0x40008000开始存放执⾏"loady 0x40008000"后, uboot就会进⼊等待状态,等着接收数据minicom具有通过uart传输⽂件的功能.按"ctrl+a", 松⼿后再按"s", 选择"ymodem", 在弹出的界⾯⾥按空格键选中要传的⽂件.md 内存地址 //⽤于查看内存地址上的值⽤法:md.b 0x40008000 100 //从内存地址0x40008000开始,查看0x100个字节并输出值md.w 0x40008000 100 //从内存地址0x40008000开始,查看0x100个16位值并输出值md.l 0x40008000 100 //从内存地址0x40008000开始,查看0x100个32位值并输出值mw //⽤于修改内存地址上的值⽤法:mw.b 0x40008000 0xab 100 //从内存地址0x40008000开始的0x100字节空间,设值为0xabmw.w 0x40008000 0xabcd 100 //从内存地址0x40008000开始的0x200字节空间,每16位值设为0xabcdmw.l 0x40008000 0xabcdef88 100 //从内存地址0x40008000开始的0x400字节空间,每32位值设为0xabcdef88 go //执⾏指定内存地址上的指令⽤法:go 0x40008000mmc // sd/mmc接⼝设备(sd卡, emmc)操作命令, 按扇区操作(每扇区512字节)⽤法:mmc read addr blk cnt //从mmc设备上的第blk个扇区开始,共读出cnt个扇区到内存地址addr上mmc write addr blk cnt //把内存地址addr上的数据写⼊mmc设备的第blk个扇区,共cnt个扇区⼤⼩mmc dev //⽤于当看当前的mmc设备是第⼏个mmc erase blk cnt //把mmc设备的第blk个扇区开始清零,共清除cnt个扇区⼤⼩ mmc part //列出当前mmc设备的分区信息mmc list //列出所有的mmc设备信息ext4ls //查看存储设备的ext2/3/4分区⾥的内容⽤法:ext4ls mmc 0:2 //查看第0个存储设备的第⼆个分区ext4load //从ext2/3/4分区⾥读出⽂件到指定的内存地址⽤法:ext4load mmc 0:2 0x40008000 /uImage //从第0个存储设备的第2个分区的根⽬录读出uImage⽂件到内存地址0x40008000 fatls //查看存储设备的fat分区⾥的内容⽤法:fatls mmc 0:1 //查看第0个存储设备的第1个分区(fat分区)fatload //从fat分区⾥读出⽂件到指定的内存地址⽤法:fatload mmc 0:1 0x40008000 /uImage //从第0个存储设备的第1个分区的根⽬录读出uImage⽂件到内存地址0x40008000fatwrite //把内存上的数据存储到fat分区的⼀个⽂件⾥⽤法:fatwrite mmc 0:1 0x40008000 /my.txt 0x35 //把内存地址0x40008000开始的0x35个字节数据写⼊到第0个设备的第1个分区⾥,⽂件名为my.txtrun //执⾏指定的环境变量⾥的语句⽤法:run bootcmd //执⾏环境变量bootcmd⾥的语句//如uboot上已驱动好⽹络设备并环境变设好IP及PC端IP,还可以使⽤以下命令:tftpboot 0x40008000 ⽂件名 // 通过⽹络下载⽂件到内存地址0x40008000, PC端需配置好tftp服务器nfs 0x40008000 pc端IP:/带路径的⽂件名 //pc端需配置好nfs服务器ping ip //检测⽹络是否通指令: bootmbootm ⽤于将内核镜像加载到内存的指定地址处例:bootm 0x82000000查看和修改环境变量指令常⽤环境变量列表bootdelay 执⾏⾃动启动(bootcmd中的命令)的等候秒数baudrate 串⼝控制台的波特率bootfile 默认的下载⽂件名bootargs 传递给Linux内核的启动参数bootcmd ⾃动启动时执⾏命令stdin 标准输⼊设备,⼀般是串⼝stdout 标准输出,⼀般是串⼝,也可是LCD(VGA)stderr 标准出错,⼀般是串⼝,也可是LCD(VGA)serverip TFTP服务器端的IP地址ipaddr 本地的IP地址ethaddr 以太⽹的MAC地址netmask 以太⽹的⽹络掩码gatewayip 以太⽹的⽹关指令: setenvname value第1个参数是环境变量的名称。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
bootm命令中地址参数,内核加载地址以及内核入口地址
分类:u-boot2010-11-04 10:472962人阅读评论(0)收藏举报downloadlinuxbytecmdheaderimage
bootm命令只能用来引导经过mkimage构建了镜像头的内核镜像文件以及根文件镜像,对于没有用mkimage对内核进行处理的话,那直接把内核下载到连接脚本中指定的加载地址0x30008000再运行就行,内核会自解压运行(不过内核运行需要一个tag来传递参数,而这个tag是由bootloader提供的,在u-boot下默认是由bootm命令建立的)。
通过mkimage可以给内核镜像或根文件系统镜像加入一个用来记录镜像的各种信息的头。
同样通过mkimage也可以将内核镜像进行一次压缩(指定-C none/gzip/bzip2),所以这里也就引申出了两个阶段的解压缩过程:第一个阶段是u-boot里面的解压缩,也就是将由mkimage压缩的镜像解压缩得到原始的没加镜像头的内核镜像。
第二个阶段是内核镜像的自解压,u-boot 里面的解压实际上是bootm 实现的,把mkimage -C bzip2或者gzip 生成的uImage进行解压;而kernel的自解压是对zImage进行解压,发生在bootm解压之后。
下面通过cmd_bootm.c文件中对bootm命令进行解析以及执行的过程来分析,这三种不同地址的区别:
ulong load_addr = CFG_LOAD_ADDR; /* Default Load Address */
int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
......
if (argc < 2) {
addr = load_addr;//当bootm命令后面不带地址参数时,将默认的加载地址赋值给addr
} else {
addr = simple_strtoul(argv[1], NULL, 16); //如果bootm命令后面带了加载地址,则将该地址赋值给addr,所以最终有用的地址还是bootm命令后附带的地址
}
......
//
switch (hdr->ih_comp) { //开始判断利用mkimage命令后是否对内核镜像进行了压缩
case IH_COMP_NONE: //如果没有被压缩,只是在原有的内核镜像前加了一个头
if(ntohl(hdr->ih_load) == addr) { //这步很重要,涉及到我们要讨论的两个地址,我们知道在利用mkimage时指定-a选项后面就是指定的内核加载的地址,这个地址会被存放到镜像头结构的ih_load成员变量中如在smdk2410中ih_load为0x30008000,在这里开始作地址的判断,如果指定的加载地址和之前的addr也就是bootm后面附带的地址相同,则不用将内核镜像搬到其他地方,就在这个地址上执行,这样内核的入口地址就要在加载地址之后的64个字节(因为镜像头占了64个字节),所以入口地址为0x30008040
printf (" XIP %s ... ", name);
} else {//如果指定的加载地址和bootm命令后的附加地址不相同,我们看看下面data此时表示的是什么地址:data = addr + sizeof(image_header_t);可以看到如果指定加载地址与bootm命令后地址不相同,则从bootm命令后面地址所在地取出内核镜像的头进行检验,检验完后data指向真正的内核,然后将内核拷贝到指定的加载地址处来进行自解压运行,这个时候内核的入口地址就和加载地址一样,不需要加上40个字节,因为内核镜像前面的40个字节的头已经被取出来了。
memmove ((void *) ntohl(hdr->ih_load), (uchar *)data, len);
}
case IH_COMP_GZIP://如果利用mkimage时对内核镜像进行了压缩,则需要在u-boot内进行第一阶段的解压缩,将解压后的内核镜像存放到指定的加载地址ih_load,然后内核镜像自解压启动
printf (" Uncompressing %s ... ", name);
if (gunzip ((void *)ntohl(hdr->ih_load), unc_len,(uchar *)data, &len) != 0) {
puts ("GUNZIP ERROR - must RESET board to recover/n");
SHOW_BOOT_PROGRESS (-6);
do_reset (cmdtp, flag, argc, argv);
}
break;
}
所以如果使用mkimage生成内核镜像文件的话,会在内核的前头加上了64byte的信息,供建立tag之用。
bootm命令会首先判断bootm xxxx 这个指定的地址xxxx是否与-a指定的加载地址是否相同。
(1)如果不同的话会从这个地址开始提取出这个64byte的头部,对其进行分析,然后把去掉
头部的内核复制到-a指定的load地址中去运行之
(2)如果相同的话那就让其原封不同的放在那,但-e指定的入口地址会推后64byte,以跳过这64byte的头部。
我们来看看这三个地址的不同情况:
1> mkimage -A arm -O linux -T kernel -C none -a 30008000 -e
30008040 -n linux-2.6.18.8 -d zImage uImage2.6.18.8-8040
这种情况,只能把uImage download到30008000的位置上,否则从30008040
是启动不了的。
原因:如果将uImage(加了头的镜像文件)下载到不同于指定加载地址的地方,则会进行上面的操作,将去掉头部的内核拷贝到指定的加载地址,此时加载地址和入口地址需要是相同的,因为已经没有镜像头了,所以此时入口地址也应该为30008000,而不应该再加上64个字节
所以在构建镜像头部中的加载地址和入口地址时千万要考虑下载的地址,否则将会启动不了。
2> mkimage -A arm -O linux -T kernel -C none -a 30008000 -e
30008000 -n linux-2.6.18.8 -d zImage uImage2.6.18.8-8000
这种情况download地址随便。
还是按上面说的,因为将加载地址和入口地址设置成同样的地址,在下载到任意地址时,将去掉头部的内核镜像拷贝到指定加载地址后,可以直接从加载地址开始启动。
但是要是下载地址和指定加载地址相同呢?也就是下面的:
如果tftp 下载地址==0x30008000 ,此时因为下载地址和指定加载地址相同,所以就不会搬动,内核直接从指定加载地址自解压啦,但是因为指定的入口地址也是0x30008000,还是在镜像头处,可以看到上面的代码,如果相同没有做任何事,只是打印了提示信息,所以还得将入口地址往后推后64个字节还是从0x30008040 启动就肯定OK 。
所以在制作镜像头以及下载地址就有两种情况:
1,mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage zImage.img
加载地址和入口地址相同
tftp 0x31000000 zImage.img
bootm 0x31000000
下载地址可以任意放。
2,mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img
入口地址在加载地址后面64个字节
tftp 0x30008000 zImage.img
bootm 0x30008000
下载地址一定要在指定的加载地址上。