uImage相关地址
来源:互联网 发布:短作业优先算法 编辑:程序博客网 时间:2024/04/28 06:50
uImage相关地址
U-Boot, a boot loader for Embedded boards based on PowerPC, ARM, MIPS and several other
processors
uImage是在待被引导映像(比如linux的zImage)基础之上添加文件头部而得到的。文件头部中保存的内容是关于待引导映像的信息说明和地址,该文件头部由u-boot使用bootm引导命令时进行读取,bootm命令会对文件头进行解析,得到Load Address和Entry Point。
本文以待被引导映像zImage为例,说明uImage 及其u-boot引导命令bootm工作原理。
下面是使用mkimage工具将待被引导映像zImage打包生成uImage后的文件头部信息:
Image Name: Linux-3.4.79
Created: Thu May 1 18:58:29 2014
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4529496 Bytes = 4423.34 kB = 4.32 MB
Load Address: 40008000
Entry Point: 40008000
理解Load Address和Entry Point 这两个地址
理解这两个地址之前,应该明白uImage不是烧写到什么地方,u-boot就必须直接转移到该处直接执行。通常u-boot会读取uImage的文件头部信息,然后将uImage中的zImage复制到内存RAM中后,在转移到内存RAM中执行。
u-boot中有个bootm命令,专用与对uImage映像文件的引导,其工作原理是,先读取uImage的文件头部,根据头部中的Load Address和Entry Point这两个地址,决定如何对uImage中的zImage部分进行引导。
Load Address 是告知u-boot,该uImage映像文件中的zImage部分应该被u-boot的bootm命令加载到的RAM内存中的地址,故该地址是用户希望的zImage部分在内存RAM中的运行地址。
Entry Point 是告知u-boot,u-boot将uImage映像文件中的zImage部分加载到Load Address地址之后,应该转移到Entry Point地址处执行引导。
uImage映像文件烧写时一般保存在非易失存储器中,如flash,nand,mmc上,但有时调试时也可以直接下载到内存RAM中进行调试。
根据uImage映像文件是否具有XIP能力(即能直接在flash上执行,是否具有该能力是在编译时通过配置确定的)和烧写位置不同可分为以下四种情况。其中除了uImage是XIP以外,我们都希望uImage最终被放到内存RAM中执行,毕竟RAM中程序执行的速度要比XIP时速度快。
1)uImage映像文件直接下载到RAM内存中;
2)uImage映像文件烧写到flash上,但不具备XIP能力;
3)uImage映像文件烧写到flash上,且具备XIP能力;
4)uImage映像文件文件烧写到nand,mmc上;
其中第4种情况不再讨论是否具备XIP能力,是因为烧写到nand,mmc上时,一般是因为该开发板没有flash,或者即使有flash,一般会将uImage拷贝到RAM中运行,而不是拷贝到flash上去XIP执行。第1种一般是调试情形,另外是否具有XIP。
------------------------------------------------------------------------------------------------
先来看第一种情况:
uImage映像文件直接下载到RAM内存中,此种情况下,
烧写地址:在编译生成uImage之前,你就应该确定uImage的最终在内存中的运行地址,即Entry Point ,和u-boot的bootm命令处理uImage后应该将待被引导映像zImage加载到内存RAM中的地址即Load Address。
假如开发板的RAM地址空间为 0x40000000 ~ 0x60000000,你希望待被引导映像zImage最终被放在0x40008000地址处运行,那么uImage中的Load Address 和Entry Point应如下:
Load Address: 40008000
Entry Point: 40008000
其中Load Address表明:用户想让u-boot的bootm命令执行后复制待被引导映像zImage放置到这个地址处。
其中Entry Point 表明:用户想让在u-boot的bootm命令执行后待被引导映像zImage放置到这个地址处之后,bootm命令准备好zImage引导参数并跳转到Entry Point处,这实际上等价于在Entry Point处下载zImage,并在此处引导zImage运行。
理解了上边的工作原理,就能确定烧写地址了,既然bootm会复制uImage中的待被引导映像zImage到地址Load Address处,因此烧写地址处uImage所占用的空间不与复制之后zImage所占空间有交集,那肯定不会出现问题。比如Load Address: 40008000和
Entry Point: 40008000情况下,烧写地址确定为0x50000000或者0x51000000等等都行。
烧写命令如下: tftpboot 0x50000000 uImage ,然后使用bootm 0x50000000 命令引导。
注:tftp下载方法配置见其他文章。
烧写地址处uImage所占用的空间不与复制之后zImage所占空间有交集,一种特殊情况是
用户直接将uImage放到想要位置上,这时bootm就会根据位置计算出zImage已经处于
Load Address处,因此就不会复制了,此种情形下,uImage烧写地址应该位于
Load Address - 0x40 位置处, 减去0x40的原因是因为uImage的文件头部大小是0x40(64Byte)。
比如Load Address: 40008000和Entry Point: 40008000情况下,烧写地址应为0x40007fc0。烧写命令如下: tftpboot 0x40007fc0 uImage ,然后可以使用bootm 0x40007fc0 命令引导
或者使用zImage引导命令 bootz (当然你的u-boot必须先支持bootz)。
未完待续...
- uImage相关地址
- uImage入口地址
- uImage
- uImage
- uImage
- UImage
- uImage
- 相关地址
- 如何让linux内核make uImage时Entry Point(入口地址)自动偏移64个字节
- 如何让linux内核make uImage时Entry Point(入口地址)自动偏移64个字节
- 英保通相关下载地址
- SVN相关下载地址
- 相关信息网络地址。。。
- MAC地址相关知识
- 相关网站地址
- 计算相关地址
- solr 相关资料地址
- Jetty相关地址
- hdu 1253 胜利大逃亡
- leetcode第一刷_Linked List Cycle
- 分区表主键索引分区的前提是包含分区字段或本身就是分区字段
- 一致性hash算法 - consistent hashing
- Jeecms源码分析(三)
- uImage相关地址
- 逆波兰计算器(C语言)
- 487-3279
- android menu 使用总结1
- svn版本控制系统基本操作
- Jeecms验证码-jcaptcha
- JavaScriptMemoryValidatorEvaluationSetup
- NYOJ—171—聪明的kk
- Python 迭代器