Chinaunix
标题:
U-BOOT中的start.s一些疑问
[打印本页]
作者:
jun_h_sc
时间:
2008-08-21 13:23
标题:
U-BOOT中的start.s一些疑问
关于U-BOOT的问题!请大家帮帮忙 ,先谢了!
最近看了u-boot关于s3c440bx的移植代码,其中对于start.s中有几处不明白的地方
/*
now copy to SRAM the interrupt vector
*/
adr r0, real_vectors
add r2, r0, #1024
ldr r1, =0x0c000000
add r1, r1, #0x08 <===为什么要加上0x08?
vector_copy_loop:
ldmia r0!, {r3-r10}
stmia r1!, {r3-r10}
cmp r0, r2
ble vector_copy_loop
还有一个问题:
real_vectors:
b reset
b undefined_instruction
b software_interrupt
b prefetch_abort
b data_abort
b not_used
b irq
b fiq
/*************************************************/
undefined_instruction:
mov r6, #3
b reset
software_interrupt:
mov r6, #4
b reset
prefetch_abort:
mov r6, #5
b reset
data_abort:
mov r6, #6
b reset
not_used:
/* we *should* never reach this */
mov r6, #7
b reset
irq:
mov r6, #8
b reset
fiq:
mov r6, #9
b reset
为什么用r6附值,为什么给r6附不同的值?
不同的模式跳转到reset时,r6中的值是不同的,通过这个值来判断当前处于什么模式,这具体是怎么实现的?
源代码见附件
[
本帖最后由 jun_h_sc 于 2008-8-21 16:08 编辑
]
s3c44b0-uboot-1.1.1-start.S.rar
2008-08-21 16:08 上传
点击文件名下载附件
2.19 KB, 下载次数: 60
作者:
xpl
时间:
2008-08-21 13:23
大概看了一下code。
基本上没看出来什么特别的地方。对于uboot的code真没怎么研究过。
给一些我的想法吧:
第一个 +0x8,这个让我想起内核中THREAD_START_SP,是THREAD_SIZE - 8,也不是从头开始,为什么呢?感觉这两个似乎有点联系,但是不太清楚原因。
第二个r6的值,我感觉是用来调试使用的,这样在reset的时候,可以从r6的值判断出来是从哪里reset的。
作者:
rodgerluo
时间:
2008-08-21 13:31
标题:
回复 #1 jun_h_sc 的帖子
好帖!! 支持一个!
作者:
friendlyQQ
时间:
2008-08-21 13:48
标题:
回复 #1 jun_h_sc 的帖子
好贴啊,等待有经验的同仁回答
作者:
vitoUNIX
时间:
2008-08-21 14:24
不是很清楚+0x08好象是跟流水线有关系??又好象不是 等高人指点
作者:
rodgerluo
时间:
2008-08-21 14:38
real_vectors位置在哪里?
作者:
xpl
时间:
2008-08-21 14:41
第一个问题应该和流水线没有关系
流水线一般用nop之类的指令,不会去加8
uboot的代码没有看过。不过无所谓了,就是选择一个地址而已,也许有深层次的原因。
第二个问题。r6在uboot中应该有特殊的用途,这个很明显。
你给的code不全,我也没看过这部分的代码,就不知道了。
发现arm中这部分的代码都写的很像,和kernel boot中的code是一个模子出来的。
作者:
bitmilong
时间:
2008-08-21 14:42
參考下吧
http://linux.chinaunix.net/bbs/v ... p%3Bfilter%3Ddigest
作者:
jun_h_sc
时间:
2008-08-21 16:14
感觉6楼不太具体,源代码已经上传了,麻烦看下然后帮忙解决下。
谢谢7楼的达达,但是你所提供的资料没有我们问题中所想要的答案。
补充下:
./u-boot/s3c44b0/start.S
version--U-Boot 1.1.1
希望大家能帮忙解决下
作者:
sep
时间:
2008-08-21 17:12
1、now copy to SRAM the interrupt vector看起来是将中断向量表copy到sram中,从而达到中断快速处理的目的。偏移量0x08应该是软件中断swi handler所在之处。我只了解这一点。至于为什么uboot这样做,想不明白。
2、用r6置值之类的,不用管,没什么意义。每个异常中断handler都b reset了,即是说任何异常都只有导致reset。给r6置不同的值只不过让看代码的人清晰一点罢了。当然你可以修改那些代码,让异常发生时,按照你的想法进行处理。
作者:
蓝豆
时间:
2008-08-21 18:41
不太清楚,不过楼主可以将问题1和2的地方修改一下,看启动后有什么效果
作者:
wu461935024
时间:
2008-08-21 20:06
我同意9楼和10楼的对r6的解释,我觉得因为此阶段不需要中断处理(已经把中断关闭了),所以只是形式内容上填充了b reset指令,并且调试过程中可通过r6中的值知道现在是处于哪种中断异常(此阶段是代码已经copy到sdram中,并且中断已经打开)
至于为什么+0x8 还等高手解决。
作者:
sep
时间:
2008-08-22 09:58
看了你的uboot1.1.1的start.S文件,我觉得有一个地方是错误的:
.globl _start
_start: b reset
ldr pc,=HandleUndef
ldr pc,=HandleSWI
ldr pc,=HandlePabort
ldr pc,=HandleDabort
b .
复制代码
正确的写法应该是uboot1.3.3里的那样,如下:
.globl _start
_start: b reset/*0x0:reset handler*/
add pc, pc, #0x0c000000/*0x04:undef handler*/
add pc, pc, #0x0c000000/*0x08:swi handler*/
add pc, pc, #0x0c000000/*prefetch handler*/
add pc, pc, #0x0c000000/*data abort handler*/
add pc, pc, #0x0c000000/*not use*/
add pc, pc, #0x0c000000/*irq handler*/
add pc, pc, #0x0c000000/*fiq handler*/
复制代码
这样的话ldr r1, =0x0c000000 | add r1, r1, #0x08才能说通。
首先要了解的是:由于arm流水线体制,当我们读取pc的值时,得到的结果是当前pc的值+8。如当swi异常发生时,pc会取得该指令add pc, pc, #0x0c000000/*0x08:swi handler*/,执行后pc=当前pc值0x08+0x08+0x0c000000=0x0c000010,0x0c000010就是pc跳转后的指令地址,也是swi handler在sram的所在之处。故add r1, r1, #0x08就保证了swi handler能被copy到0x0c000010。同理别的异常也是类似的。
至于uboot1.1.1的,是直接给pc置值的,我觉得add r1, r1, #0x08是一个失误。你可以调试看看,用axd或者串口打印信息都可以。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2