S3C2410 U-BOOT之stage1

来源:互联网 发布:8245更改mac 编辑:程序博客网 时间:2024/06/06 19:24

s3c2410 u-bootstage1

前言

         本文主要是基于大家比较熟悉的s3c2410,对移植u-bootstage1过程进行一个分析,网上关于之方面的资料很多,但是几乎都只是对代码作注解,容易让人产生知其一不知其二的感觉,在这里,我主要结合u-bootstage1时的内存布局和stage1的具体指令来做个分析,这样看起来比较直观,更容易理解一些.

一、全局看u-boot

我们要深入理解u-boot如何工作的,以及跟硬件都有什么依赖,我们需要先对u-boot及硬件有一个全局的认识。

在这之前,为了更多的人不会迷糊一些问题,先澄清几个概念:

_start:这是u-boot的第一条指令入口地址,如果从flash启动,就是0x0,如果直接下载到SDRAM中执行,则是TEXT_BASE=0x33F80000.

_TEXT_BASE:本身是一个地址,但是地址处放的内容是TEXT_BASE,

s3c2410中我们通常设为0x33F80000,通过config.mk中的-Ttext $(TEXT_BASE)来指定链接选项,从而更新链接脚本中的入口地址,不明白的去查查linker and loader.

cpu/arm920t/start.S

_TEXT_BASE:

.word TEXT_BASE

  _armboot_start:本身也是一个地址,但是地址处放的内容是_start,如果_start0x33F80000,_artboot_start放的内容就是0x33F80000,见cpu/arm920t/start.S

  _armboot_start:

       .word _start

知道这三个地址之后,再看两条指令:

adr r0,_start   /*r0 <- current position of code*/

这条指令网上讲得也很多,翻译过来就是add r0,r0,[PC+#offset],就是把通过一个地址来知道_start处的地址,注意是地址,即TEXT_BASE=0x33F80000,这步在链接的时候就已经确定了,或者你不用管那么多,你知道链接完成之后,这条指令相当于mov r0,0x33F80000(sdram)或者mov r0,0x0(flash)就行了。

ldr r1,_TEXT_BASE   /* test if we run from flash or RAM */

注意,这里的ldr不是伪指令,伪指令表示时,ldr r1,=_TEXT_BASE

这两个的区别在于,伪指令是直接把_TEXT_BASE写入到r1中,这里_TEXT_BASE就代表一个地址,而ldr r1,_TEXT_BASE,是把_TEXT_BASE中存放的内容,也就是TEXT_BASE=0x33F80000写入到了r1.

ldr    r2, _armboot_start

结合上面讲的,应该知道,这条语句实际上是将_armboot_start中的内容,也就是_start的地址写入到了r2中,而非网上很多人问的是_armboot_start的地址.

ldr    r3, _bss_start

这跟上面一样分析了,定义见cpu/arm920t/start.S

.globl _bss_start

_bss_start:

  .word __bss_start

下面这两条语句也就好理解了:

  sub       r2, r3, r2         /* r2 <- armboot 大小  */

  add r2, r0, r2          /* r2 <-代码结束地址  */

到底armboot的大小都包含了哪些东西,结合u-boot.lds,见下图:

 

 

  

  关于链接脚本,讲起来又很多了,不清楚的,建议看看linker and loader,清楚代码的编译链接及加载过程,是我们更深入的理解底层机制的根本。

 

在上面,我只是讲了几个平时可能遇到的,又不太理解的问题,关于stage1中代码的注释网上一搜就有一大把。看了注释,再结合,我讲的这几点,应该能弄清stage1中是如何拷贝代码的了。接下来,我们来看看为什么TEXT_BASE的值是0x33F80000呢?

二、TEXT_BASE=0x33F80000的由来?

先看一个SDRAM的内存映射图:同样结合上面的uboot.lds

0x33F80000

0x30000000

0x33ffffff

映射前

映射后

 


bss段、u-boot cmd段、.data.rodata

.text段及中断向量表

malloc区域,见start.S  sub r0,r0, #CFG_MALLOC_LEN

全局变量,见start.S sub  r0, r0, #CFG_GBL_DATA_SIZE

IRQ:sub    r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)

sub   sp, r0, #12                 /* leave 3 words for abort-stack    */

.

.

 

bss

u-boot cmd

.data数据段

.rodata只读数据段,

入口20字节中断向量表.text(start.o*(.text))

 

  在S3C2410中,查看datasheet64M SDRAM地址空间即为0x300000000x33ffffff,在bank6中,而flash映射地址为0x0开始。

  TEXT_BASE=0x33F80000即为程序加载起始地址,可以使用的空间大小即为0x33F800000x33FFFFFF512K,如果你u-boot包含的功能太多,觉得不够用,你可以把0x33F80000调小一点,即和往低地址移一些,移的过程中注意memory page对齐就行了,一般是4KB.