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

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文件,我觉得有一个地方是错误的:
  1. .globl _start
  2. _start:        b       reset
  3.         ldr pc,=HandleUndef
  4.         ldr pc,=HandleSWI
  5.         ldr pc,=HandlePabort
  6.         ldr pc,=HandleDabort
  7.         b .
复制代码

正确的写法应该是uboot1.3.3里的那样,如下:
  1. .globl _start
  2. _start:        b       reset/*0x0:reset handler*/
  3.         add        pc, pc, #0x0c000000/*0x04:undef handler*/
  4.         add        pc, pc, #0x0c000000/*0x08:swi handler*/
  5.         add        pc, pc, #0x0c000000/*prefetch handler*/
  6.         add        pc, pc, #0x0c000000/*data abort handler*/
  7.         add        pc, pc, #0x0c000000/*not use*/
  8.         add        pc, pc, #0x0c000000/*irq handler*/
  9.         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