原创 Uboot在Nand Flash和SDRAM中的地址映射

2011-10-21 08:23 2222 6 6 分类: MCU/ 嵌入式

1         我的困惑

(1)  .lds文件到底起什么作用

(2)  start.o中初始化和文字池的关系(汇编语言问题),以及的那几个变量的作用

注:本文是基于u-boot-1.1.6编写的。

2         我的解决方法

(1)  .lds文件到底起什么作用

.lds的源代码如下:

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/

OUTPUT_ARCH(arm)

ENTRY(_start)

SECTIONS

{

       . = 0x00000000;           定位当前的地址为0地址

 

       . = ALIGN(4);              代码以4字节对齐

       .text      :                       指定代码段

       {

         cpu/arm920t/start.o       (.text)     ;代码的第一个代码部分

         *(.text)                    ;其它代码部分,但我不知道具体是那些。但其属性必须是.text

       }

 

       . = ALIGN(4);

       .rodata : { *(.rodata) }

 

       . = ALIGN(4);

       .data : { *(.data) }

 

       . = ALIGN(4);

       .got : { *(.got) }

 

       . = .;

       __u_boot_cmd_start = .;          __u_boot_cmd_start 赋值为当前位置

       .u_boot_cmd : { *(.u_boot_cmd) }        ;指定u_boot_cmd段,uboot把命令放在该段

       __u_boot_cmd_end = .;

 

       . = ALIGN(4);

       __bss_start = .;

       .bss : { *(.bss) }

       _end = .;

}

      我们用图1来表示一下上面的空间分配。

20111021082133001.gif

1 ubootflash中的分配

      我现在的疑问是这个图是什么地方的空间分配。

我们知道.lds文件的作用是“决定一个可执行程序的各个段的存储位置,以及入口地址”。那么,.lds决定了ubootflash中的分配情况了。

(2)        start.o中初始化和文字池的关系(汇编语言问题),以及的那几个变量的作用

start.o中有如下的代码,这些的代码的作用是声明并初始化变量。其中的值是各代码段在内存中的位置。

_TEXT_BASE:

      .word   TEXT_BASE

 

.globl _armboot_start

_armboot_start:

      .word _start

 

/*

 * These are defined in the board-specific linker script.

 */

.globl _bss_start

_bss_start:

      .word __bss_start

 

.globl _bss_end

_bss_end:

      .word _end

 

#ifdef CONFIG_USE_IRQ

/* IRQ stack memory (calculated at run-time) */

.globl IRQ_STACK_START

IRQ_STACK_START:

      .word   0x0badc0de

 

/* IRQ stack memory (calculated at run-time) */

.globl FIQ_STACK_START

FIQ_STACK_START:

      .word 0x0badc0de

#endif

由于系统是从flash0x0000_0000位置启动的,而我们在.lds文件中讲start.o放在了这个位置,所以系统会从这里开始启动。根据源代码,我们可以分析出如下的uboot启动步骤:

    关闭watchdog

    关闭IRQ等中断

    设置CLK

    关闭cacheMMU

    初始化话SDRAM控制器

    flash中的区别uboot映像搬到SDRAM中【将我们图1中的内容,搬到SDRAM中,具体如图2所示】

    建立堆栈【这一块涉及内存空间分配】【这一块涉及内存空间分配,具体如图2所示】

    清空.bss

    通过ldr pc, _start_armboot进入stage2,也就是进入C代码

 

2uboot在存储器中的映射

20111021082134002.jpg

2 uboot在存储器中的映射

   我现在关于.lds文件和.bss区还有一些分析的不透彻的地方。但总而言之,当stage1完成后回生成上面的图2。而图2决定了我们可以运行C语言了。

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条