S3C2410 U-BOOT之stage1
来源:互联网 发布:8245更改mac 编辑:程序博客网 时间:2024/06/06 19:24
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.
- S3C2410 U-BOOT之stage1
- s3c2410 u-boot 之 stage1
- U-BOOT之stage1
- U-Boot Stage1
- u-boot移植s3c2410
- 移植u-boot到S3C2410
- 移植u-boot到S3C2410
- s3c2410 u-boot 2009.03 配置
- s3c2410 u-boot启动过程
- S3C2410 u-boot 移植记录
- U-BOOT FOR S3C2410 NAND-BOOT
- U-boot分析与移植(2)----U-boot stage1分析
- U-boot分析与移植(2)----U-boot stage1分析
- U-boot分析与移植(2)----U-boot stage1分析
- U-boot分析与移植(2)----U-boot stage1分析
- U-boot分析与移植(2)----U-boot stage1分析
- U-Boot在S3C2410上的移植
- U-Boot在S3C2410上的移植
- 产品经理值得读的12本书
- 我想考中国科大(合肥)的博士
- mii-tool的限制/mii-tool和千兆网络
- 转:C++和Java的语法对比
- 有用的JavaScript1
- S3C2410 U-BOOT之stage1
- Android的动画布局
- linux下查看硬件信息命令
- 最近在学习李彦昌的80x86保护模式
- 有关 #pragma push_macro("new") 的用法
- 个人收藏 WebDynpro 开发layout不能显示的解决方法
- Poll系统调用
- C#3.0 中的扩展方法 (Extension Methods)
- 该长大了