bootstrap和u-boot内存地址映射问题分析

一、一级启动bootstrap和二级启动u-boot内存地址

1、一级启动代码Bootstrap修改的文件在Bootstrap-v1.16\board\at91sam9261ek\nandflash目录下的at91sam9261ek.h中的(在项目程序中未作修改)

#define   IMG_ADDRESS          0x20000            /* Image Address in NandFlash */

#define   IMG_SIZE                   0x40000            /* Image Size in NandFlash    */ 

IMG_ADDRESS为Uboot在Nandflash中存放的起始地址,IMG_SIZE为文件大小,单位为KB,根据实际情况设定。

另外添加了支持的Nandflash的信息在Bootstrap-v1.16\include目录下的nand_ids.h文件中的

{0xecF1, 0x400, 0x20000, 0x800, 0x40, 0x0, "K9F1G08U0B\0"},

具体意义见Bootstrap-v1.16\include目录下的nandflash.h中的介绍

Bootstrap编译过程:在Bootstrap-v1.16\board\at91sam9261ek\nandflash目录下有个makefile文件,只需用gcc编译工具(本程序是在Cygwin环境下)make目录中的makefile文件即可在当前文件下生成所需的可执行文件,然后用SAM-BA工具烧写到Nandflash中(具体方法在此不做说明)。

2、Uboot修改的文件在u-boot-1.3.4\include\configs目录下的at91sam9261ek.h文件中的

#undef CFG_USE_DATAFLASH_CS0

/*#undef CFG_USE_NANDFLASH    */

#define CFG_USE_NANDFLASH                 1

#define CFG_ENV_IS_IN_NAND      1

#define CFG_ENV_OFFSET                0x60000

#define CFG_ENV_OFFSET_REDUND      0x80000

#define CFG_ENV_SIZE             0x20000            /* 1 sector = 128 kB */

#define CONFIG_BOOTCOMMAND "nand read 0x22000000 0xa0000 0x200000; bootm"

CFG_ENV_OFFSET和CFG_ENV_OFFSET_REDUND为存放uboot环境变量的起始地址,大小为0x20000。从0xa0000为应用程序代码存放的起始地址,大小为0x200000。

编译过程:修改完以上环境变量后,在根用户下进入到u-boot-1.3.4目录执行以下命令

[root@localhost u-boot-1.3.4]#make distclean

[root@localhost u-boot-1.3.4]# make at91sam9261ek_config

Configuring for at91sam9261ek board...

[root@localhost u-boot-1.3.4]#make

然后等待编译完成,需要一段时间,编译完成后在u-boot-1.3.4文件目录下就会生成u-boot.bin文件

然后通过SAM-BA烧写到Nandflash中。

二、开发过程中遇到的问题以及解决实例

1、  开发板提供的Bootstrap的源代码中,会有提示这个版本的Bootstrap可以支持的有哪些类型的开发板,其实这个代码是可以在官网上下载的,只不过不同版本可能支持的开发板类型有所不同。在编译Bootstrap前一般首先配置这个板子的文件,这个配置也就申明了和这款开发板相关的基本配置。当第一条make at91sam9g45ekes_nandflash_config这个命令执行后,在include/config.mk文件里的东西就是板子配置好的默认信息。信息中汇说明你的板子类型和架构类型。

2、  但是自我觉得u-boot和bootstrap结合的部分肯定有地址映射部分,u-boot在最终编译好的bin文件,里面在内存的地址映射是写死的,如果在编译u-boot的时候指定配置文件的话(比如上边的就是指定的文件),在make进行编译的时候会根据这个这个配置文件加载编译,这里可以举一个例子来说明。

u-boot中board/atmel目录是说明板子的类型。在board/atmel目录下的文件目录有支持的各种板子类型(可能是根据CPU类型规定的),这里的每一个目录都是一种板子的类型,假如使用的开发板类型就是at91sam9m10g45ek,这个目录里有congfig.mk文件,这个文件只用一行,就是TEXT_BASE = 0X73F00000.这个就是在编译好u-boot之后,在u-boot.map文件里说明的地址映射。这个映射时一定要和bootstrap保持一致的。如果修改这个文件里的内容,修改基址地址,再重新编译,在u-boot.map文件里的映射地址就会修改。

3、  关于这个地址:这个地址是内存的地址,比如在bootstrap启动之后,会到内存的某个地址找u-boot进行启动u-boot,这个地址说明的就是内存地址,这两个地址一定要吻合才能正确启动,也就是bootstrap中指定bootloader到内存的某个地址寻找u-boot和u-boot中的TEXT_BASE指定的将来存放到内存的某个地址。两个地址不吻合时不能启动成功。为了使两个地址吻合,也就产生了谁去迁就谁的问题。可以让bootstrap修改去迁就u-boot但是有的开发板上的bootstrap是从官网上下载的编译好的程序,没办法修改,同时也不知道在哪里修改,但是如果知道这个bootstrap想从内存的哪个地址启动u-boot,可以修改u-boot的内容,按照指定的手册操作后便可以启动,比如这个地址是0x73f00000,但是开发板上的u-boot上指定的映射地址是0x77f00000,所以修改了上述文件里的地址再从新编译后,在u-boot.map文件中,映射地址便为0x73f00000。对于两个文件的地址吻合问题,只要是相互对应即可,可以修改u-boot代码内容,也可以修改bootstrap代码中的内容。

4、  在bootstrap源代码中,可以找到与u-boot相互对应的映射地址,在bootstrap目录下,在和开发板相关的配置目录下有和这些相关的配置信息。

在这个配置文件中,一般都有下面这几项信息。从手册参考这个定义可得知:

         IMG_ADDRESS0X20000 是u-boot在nandflash中的位置,从nandflash的这个位置开始,u-boot的大小为 IMG_SIZE  0X40000

         下面是LOGO_SIZE  0X100000 是标志的大小(在实际应用上没有什么作用)

         LOGO_ADDRESS   0Xa0000  是表示标志信息在nandflash中的地址

         LOGO_RAM0X71000000 是映射到内存的地址

但是JUMP_ADDR  0X77F00000  是最终bootstrap跳转到的内存地址,从这个内存地址来启动u-boot。

所以,上述得知,关于这个地址映射问题,只要是两个部分的地址能够吻合便可以启动,bootstrap和u-boot的内存地址映射的定义在哪里都已经说明。

你可能感兴趣的:(bootstrap,uboot,地址映射)