uboot命令说明

简介: A:Uboot的命令功能 Uboot在硬件初始化完成之后 调用 main_loop()进入一个无限循环,等待用户输入命令当用户输入命令之后,首先将调用run_command()函数, 然后调用find_cmd()...

A:Uboot的命令功能

 


Uboot在硬件初始化完成之后 调用 main_loop()进入一个无限循环,等待用户输入命令

当用户输入命令之后,首先将调用run_command()函数, 然后调用find_cmd()函数把用户从终端输入的命令进行比较,当find_cmd()返回值 不等于0,则将调用命令处理函数


find_cmd()函数将从系统默认的命令表中查询一个匹配的命令,
命令表(定义在board/fads/u-boot.lds中)
_uboot_cmd_start = .;
.u_boot_cmd : {*(.u_boot_cmd)}
_uboot_cmd_end = .;

 


u_boot_cmd中是定义的命令(定义在command.h中)
#define Struct_Section __attribute__ ((unused,section(".uboot_cmd")))
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \ cmd_tbl_t  __u_boot_cmd_##nameStruc_Section {#name, maxargs, rep , cmd, usage}


command.c中定义了和命令本身相关的命令处理程序,而cmd_***文件则是某一类型的命令处理程序,这些命令处理程序构成了U-boot命令处理功能(Uboot命令以16进制的格式显示)


B:命令使用
1.信息显示
bdinfo(缩写bdi), 打印开发的信息
coninfo(缩写conin),打印串口设备信息
flinfo(缩写fli),打印当前系统flash信息
iminfo(缩写imi),打印映像头部信息
help,打印帮助信息
2.内存控制命令
base,打印和设置内存中的地址偏移量
crc32计算校验和,用于计算一段内存空间的检验和,当该命令带3个参数表示把计算出来的校验和写到第三个参数所在的存储单元中
cmp,内存比较,用于比较两端内存内容是否相同
cp,数据拷贝,可以进行烧录flash,也可以进行内存中的数据拷贝
md,内存显示
erase,擦除flash中的内容,每次flash烧录前必须先对flash进行擦除
protect 打开和关闭写保护,防止flash重要区域不被误写
3.运行控制命令
bootm-加载和启动映像
bootm用于加载并启动使用mkimage工具(tools中)打包过的映像
bootm用于将内核映像加载到指定的地址,如果需要还要进行解压映像
然后给内核传递不同的内核参数,最后启动内核
bootm可以有2个参数,第1个参数为内核映像的地址,第二个为可选参数,即initrd映像地址
当采用ramdisk作为根文件系统时需要使用bootm第二个参数,当需要加载initrd时,uboot把内核映像加载到指定地址,然后把Ramdisk映像的大小和地址告诉内核
go-启动映像
go命令时另外一种启动映像的命令,go将直接跳转到某个地址然后执行放在该地址处的内核映像
go命令不设置环境变量,也不能解析映像


4.数据下载命令
tftpboot通过tftp协议下载映像
需配置dhcp服务器和tftp服务器,tftpboot命令之会到指定的目录下载映像
即:/etc/xinetd.d/tftp下server_args中配置的目录下,


5.环境变量设置命令
printenv(pri)打印当前环境变量
setenv-设置环境变量
当setenv有一个参数时,就是删除该环境变量,当有两个参数则把第二个参数作为环境变量
设置完要使用saveenv保存环境变量
如果想讲某个环境变量设置为多条语句,则需使用双引号
ep:
setenv bootcmd “tftpboot 0x100000000 uImage; bootm 0x10000000”


C、U-Boot环境变量
当uboot启动时,首先将调用env_init()进行初始化,从配置的环境变量所在地址CFG_ENV_ADDR
(该地址在environment.h中定义,被定义成CFG_FLASH_BASE + CFG_ENV_OFFSET)读取指定大小
的数据来计算循环冗余校验值CRC,并计算出CRC值是否和存放在环境变量区开头的CRC值相等,若相等,则证明数据没有被破坏,因此将把保存在FLASH上的地址作为环境变量地址(gd->env_addr设置为offsetof(env_t,data))

 


默认的环境变量设置在 default_environment中

unchar default_environment[] = {
#ifdef CONFIG_BOOTARGS
"bootargs=" CONFIG_BOOTARGS "\0"
#endif
#ifdef CONFIG_BOOTCOMMAND
"bootcmd=" CONFIG_BOOTCOMMAND "\0"
#endif
#ifdef CONFIG_NFSBOOTCOMMAND
"nfsboot=" CONFIG_NFSBOOTCOMMAND "\0"
#endif
#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
"bootdelay=" MK_STR(CONFIG_BOOTDELAY) "\0"
#endif
...
}
从上面可以看出,一个环境变量的设置取决于响应的宏是否已经被定义,例如只有定义的宏CONFIG_BOOTARGS才会定义环境变量”bootargs“


环境变量设置分为动态设置(通过刚才的宏)与静态设置(通过setenv)


重要的环境变量:
1.bootcmd
  环境变量用于设置启动时自动加载的命令序列,但该环境变量只有在设置了CONFIG_BOOTDELAY时才会生效,实际上 main_loop()函数只有在CONFIG_BOOTDELAY被定义且大于0时,才会对”bootcmd“进行解析
2.bootargs
bootargs可以设置内核启动参数,即用于设置传递给内核的参数
内核启动时,将对这些启动参数进行处理,即拷贝到相应的内存地址处
lib_arm目录下的armlinux.c文件中的函数 do_bootm_linux()将对启动参数进行分析
必须定义了CONFIG_CMDLINE_TAG时才会对命令进行分析
首先 调用commandline=getenv("bootargs")获得系统设置的命令行参数
调用 setup_commandline_tag()对内核命令参数进行处理
,在setup_commandline_tag()判断命令行的有效性,并拷贝到全局变量params中
params = (struct tag *)bd->bi_boot_params;
而响应的bi_boot_params是在板级对应的文件中初始化的,
gd->bd->bi_bot_params=0x10000100
这里指定的地址必须与操作系统内核指定的内核地址一致
ep:
arch/arm/mach-omap/innovator.c
MACHINE_START(INNOVATOR, "TI-Innovator/OMAP1510")
MAINTAINER("Monta Visa Software, Inc")
BOOT_MEM(0x100000000, 0xe0000000, 0xe0000000)
BOOT_PARAMS(0X10000010)  //uboot中的bi_bot_params 地址要与这里一致
FIXUP(fixup_innovator)
MAPIO(innovator_map_io)
INITIRQ(innovator_init_irq)
MACHINE_END

目录
相关文章
|
Ubuntu
ubuntu 22.04 阿里源
ubuntu 22.04 阿里源
12210 0
|
存储 网络协议 Linux
把Linux服务器做成一个下载器,实现远程下载
把Linux服务器做成一个下载器,实现远程下载
把Linux服务器做成一个下载器,实现远程下载
|
10月前
|
Unix Linux 虚拟化
VMware Workstation 17.6.2 发布下载,现在完全免费无论个人还是商业用途
VMware Workstation 17.6.2 发布下载,现在完全免费无论个人还是商业用途
47400 16
VMware Workstation 17.6.2 发布下载,现在完全免费无论个人还是商业用途
|
Kubernetes 架构师 Java
史上最全对照表:大厂P6/P7/P8 职业技能 薪资水平 成长路线
40岁老架构师尼恩,专注于帮助读者提升技术能力和职业发展。其读者群中,多位成员成功获得知名互联网企业的面试机会。尼恩不仅提供系统化的面试准备指导,还特别针对谈薪酬环节给予专业建议,助力求职者在与HR谈判时更加自信。此外,尼恩还分享了阿里巴巴的职级体系,作为行业内广泛认可的标准,帮助读者更好地理解各职级的要求和发展路径。通过尼恩的技术圣经系列PDF,如《尼恩Java面试宝典》等,读者可以进一步提升自身技术实力,应对职场挑战。关注“技术自由圈”公众号,获取更多资源。
|
编译器 Linux 开发者
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
1872 0
|
网络协议 Ubuntu 安全
网络-Telnet协议与SSH协议(命令、免密登录)及其安全性
网络-Telnet协议与SSH协议(命令、免密登录)及其安全性
898 0
网络-Telnet协议与SSH协议(命令、免密登录)及其安全性
|
缓存 关系型数据库 MySQL
Linux环境变量设置(PATH/LIBRARY_PATH/LD_LIBRARY_PATH)
Linux环境变量设置(PATH/LIBRARY_PATH/LD_LIBRARY_PATH)
9071 0
|
数据中心 网络架构 芯片
|
编译器 Shell 开发工具
Configure,Makefile.am, Makefile.in, Makefile文件之间关系
1.autoscan (autoconf): 扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是configure.ac的一个雏形。
2106 0