start.s文件的问题
我用的是u-boot1.3.2,开发板是s3c2440,所以用的是cpu/arm920t/start.s,如果谁看过这个文件,请帮忙回答下以下几个问题:
1. 127行有如下几句话,请问一下这个0x0是RAM地址还是FLASH地址?
ldrr0, =_start
ldrr1, =0x0
movr2, #16
copyex:
subsr2, r2, #1
ldrr3, [r0], #4
strr3, [r1], #4
bnecopyex
这个东西目的好像是为了把中断向量表复制过去,但是就是不知道要复制去哪里,还有就是中断向量表不是只有8*4的吗?为什么这里是16*4??
2. 程序从第178行的blcpu_init_crit返回后,进入如下这段代码:
relocate:/* relocate U-Boot to RAM */
adrr0, _start/* r0 <- current position of code */
ldrr1, _TEXT_BASE/* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup
ldrr2, _armboot_start
ldrr3, _bss_start
subr2, r3, r2/* r2 <- size of armboot */
addr2, r0, r2/* r2 <- source end address */
copy_loop:
ldmiar0!, {r3-r10}/* copy from source address [r0] */
stmiar1!, {r3-r10}/* copy to target address [r1] */
cmpr0, r2/* until source end addreee [r2] */
blecopy_loop
stack_setup:
ldrr0, _TEXT_BASE/* upper 128 KiB: relocated uboot */
subr0, r0, #CFG_MALLOC_LEN/* malloc area */
subr0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */
#ifdef CONFIG_USE_IRQ
subr0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
subsp, r0, #12/* leave 3 words for abort-stack */
clear_bss:
ldrr0, _bss_start/* find start of bss segment */
ldrr1, _bss_end/* stop here */
mov r2, #0x00000000/* clear */
clbss_l:strr2, [r0]/* clear loop... */
addr0, r0, #4
cmpr0, r1
bleclbss_l
ldrpc, _start_armboot
_start_armboot:.word start_armboot
现在问题是这样的:
a.这个代码是什么作用?
b. _TEXT_BASE只是个变量,没任何东西,怎么会和_start相等呢?
c. 进入beq stact_setup这句话在执行后,还会返回这里吗?pc值怎么处理的?如果进入了stack_setup,那等它执行完后去执行哪一句?
d. _start_armboot:.word start_armboot这句话是定义一个变量,那请问它是如何与start_armboot关联起来的?如何转去执行start_armboot.c这个文件?
[解决办法]
原来精研过这个东西,不过现在不太清楚了,我可以提供一些建议,一是从网上下周立功的说明,我原来基本就是在这个基础上看的,相当清楚.二是找周立功的开发板儿上会带.
[解决办法]
http://fpcfjf.blog.163.com/blog/static/554697932009314114647642/
或者我的博客可以有些帮助.
[解决办法]
不懂,帮顶下
[解决办法]
此时还是物理地址,应该是bootrom的地址。
[解决办法]
只是初始化一些东西。
[解决办法]
请问一下这个0x0是RAM地址还是FLASH地址?
ldr r0, =_start
ldr r1, =0x0
mov r2, #16
copyex:
subs r2, r2, #1
ldr r3, [r0], #4
str r3, [r1], #4
bne copyex
这个东西目的好像是为了把中断向量表复制过去,但是就是不知道要复制去哪里,还有就是中断向量表不是只有8*4的吗?为什么这里是16*4??
我也来说两句,这个0x0肯定不是nandflash地址(不知道你板子上是nor还是nand),有的ARM芯片内部自带有
SRAM(4K的8K的都有),且根据配置有的是从整个内存的0地址开始的,你这个0x0估计就是ARM片内的SRAM地址地址,nandflash里面通过烧录确实已经把中断向量表烧到nandflash里面了,但是运行的时候需要把它们加载到SRAM中来。
或者说,你这个0地址是已经映射过的,可能代表的是片外SDRAM?
你参考一下看看
[解决办法]
d. _start_armboot: .word start_armboot这句话是定义一个变量,那请问它是如何与start_armboot关联起来的?如何转去执行start_armboot.c这个文件?
定义一个变量在这里就相当于声明一个4BYTES的内存空间,且在这空间里放上start_armboot()这个函数的的地址。把它付给PC,就相当于强制执行这个start_armboot()程序了
[解决办法]
b. _TEXT_BASE只是个变量,没任何东西,怎么会和_start相等呢?
_TEXT_BASE是你在编译器的分散加载文件中指定的吧,好像就是比较代码的运行域和加载域是否相等,如果不相等则需要拷贝了
跟vivi的差不多。