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是在待被引导映像(比如linuxzImage)基础之上添加文件头部而得到的。文件头部中保存的内容是关于待引导映像的信息说明和地址,该文件头部由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-bootbootm命令加载到的RAM内存中的地址,故该地址是用户希望的zImage部分在内存RAM中的运行地址。

Entry Point 是告知u-bootu-bootuImage映像文件中的zImage部分加载到Load Address地址之后,应该转移到Entry Point地址处执行引导。

 

 

uImage映像文件烧写时一般保存在非易失存储器中,如flashnandmmc上,但有时调试时也可以直接下载到内存RAM中进行调试。

根据uImage映像文件是否具有XIP能力(即能直接在flash上执行,是否具有该能力是在编译时通过配置确定的)和烧写位置不同可分为以下四种情况。其中除了uImageXIP以外,我们都希望uImage最终被放到内存RAM中执行,毕竟RAM中程序执行的速度要比XIP时速度快。

1)uImage映像文件直接下载到RAM内存中;

2)uImage映像文件烧写到flash上,但不具备XIP能力;

3)uImage映像文件烧写到flash上,且具备XIP能力;

4)uImage映像文件文件烧写到nandmmc;

其中第4种情况不再讨论是否具备XIP能力,是因为烧写到nandmmc上时,一般是因为该开发板没有flash,或者即使有flash,一般会将uImage拷贝到RAM中运行,而不是拷贝到flash上去XIP执行。第1种一般是调试情形,另外是否具有XIP

------------------------------------------------------------------------------------------------

先来看第一种情况:

uImage映像文件直接下载到RAM内存中,此种情况下,

烧写地址:在编译生成uImage之前,你就应该确定uImage的最终在内存中的运行地址,即Entry Point ,和u-bootbootm命令处理uImage后应该将待被引导映像zImage加载到内存RAM中的地址即Load Address。

假如开发板的RAM地址空间为 0x40000000 ~ 0x60000000,你希望待被引导映像zImage最终被放在0x40008000地址处运行,那么uImage中的Load Address 和Entry Point应如下:

Load Address: 40008000

Entry Point:  40008000

其中Load Address表明:用户想让u-bootbootm命令执行后复制待被引导映像zImage放置到这个地址处。

其中Entry Point 表明:用户想让在u-bootbootm命令执行后待被引导映像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的文件头部大小是0x4064Byte)。

比如Load Address: 40008000和Entry Point:  40008000情况下,烧写地址应为0x40007fc0。烧写命令如下: tftpboot 0x40007fc0 uImage ,然后可以使用bootm 0x40007fc0 命令引导

或者使用zImage引导命令 bootz (当然你的u-boot必须先支持bootz)。

 

未完待续...

0 0
原创粉丝点击