打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
s3c2410 u-boot
转:http://blog.csdn.net/flickedball/archive/2009/11/25/4869044.aspx
S3C2410 U-BOOT之stage1 s3c2410 u-boot之stage1
前言         本文主要是基于大家比较熟悉的s3c2410,对移植u-boot时stage1过程进行一个分析,网上关于之方面的资料很多,但是几乎都只是对代码作注解,容易让人产生知其一不知其二的感觉,在这里,我主要结合u-boot的stage1时的内存布局和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,如果_start是0x33F80000,那_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中,查看datasheet,64M SDRAM地址空间即为0x30000000到0x33ffffff,在bank6中,而flash映射地址为0x0开始。
TEXT_BASE=0x33F80000即为程序加载起始地址,可以使用的空间大小即为0x33F80000到0x33FFFFFF共512K,如果你u-boot包含的功能太多,觉得不够用,你可以把0x33F80000调小一点,即和往低地址移一些,移的过程中注意memory page对齐就行了,一般是4KB.
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
UBoot中关于TEXT_BASE,代码重定位,链接地址相关说明
Uboot 运行时内存的分配 -- 转
u-boot启动代码start.S详解
U-boot启动分析 - 嵌入式 - IT博客
BOOT阅读笔记【转贴】
uboot中start.S详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服