Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1615443
  • 博文数量: 197
  • 博客积分: 10046
  • 博客等级: 上将
  • 技术积分: 1983
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-07 12:36
个人简介

在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。

文章分类
文章存档

2011年(2)

2010年(6)

2009年(18)

2008年(30)

2007年(100)

2006年(41)

分类: LINUX

2007-12-25 09:55:17

对下面这段经典的relocate的代码, 从细节上(汇编语言角度),我还是有点疑问,

假设 BOARD/SMDK2410/config.mk 里面的 TEXT_BASE 0x63f80000


我们就讨论, u-boot 从nor flash启动的情况:


0,问个汇编的问题, 关于 .word 查了一下, 可是还是没太明白,为什么一定要用word 呢?
比如:


.globl _bss_start
_bss_start:
.word __bss_start

ldr r2, _armboot_start
ldr r3, _bss_start

那么 写成这样行吗?
ldr r3, __bss_start (这个就是定义在System.map)





1,

relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup


adr 是怎么做到 当从 nor flash启动的时候, 就是 0 , 而debug得时候, 就是0x63f80000
的呢?

2,

ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
add r2, r0, r2 /* r2 <- source end address */


当 u-boot已经烧写道nor flash里面的时候,

_start的值是多少呢? 这里面_bss_start的值就是 __bss_start (定义在System.map) ,
可是要是想算出来 u-boot的大小, 那 _armboot_start的值就应该System.map里面的 _start值,
可是 又明明从 nor flash启动啊, _start就是0 啊。

从System.map 来看 _start 是 0x63f80000 ,
而这里又
.globl _start
_start:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
从这里来看, 从 nor flash 启动的时候, _start的地址应该就是 0 啊, 谁来解释一下啊?

谢谢了。
阅读(2212) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~