|
这是blob里的_trampoline的部分代码:我有几个地方不明白。
.globl _trampoline
_trampoline:
/* clear the BSS section */
ldr r1, bss_start
ldr r0, bss_end
sub r0, r0, r1
/* r1 = start address */
/* r0 = #number of bytes */
mov r2, #0
clear_bss:
stmia r1!, {r2}
subs r0, r0, #4
bne clear_bss
/* setup the stack pointer */
/*从这里开始它说是设置堆栈指针,但是下面几段代码几乎都是重复的,这样做有什么意义吗? 这是针对s3c44b0x移植的,但是我在手册上找不到cpsr_cxsf
这个寄存器,这里它是什么?有什么作用? adr指令书上介绍说是将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。这里是这样的吗,那这个堆栈指针的设置又有什么用呢,是全局的堆栈指针吗? irqstack在哪里定义了,它指的是内存中的哪里?我只在blob.map中找到了irqstack。顺便问一下,blob.map对我读blob源代码有用吗,我该如何去用它?打扰了,谢谢!!
mrs r0, cpsr
bic r0, r0, #0x1f
orr r1, r0, #0xdb
msr cpsr_cxsf, r1
adr sp, irqstack
mrs r0, cpsr
bic r0, r0, #0x1f
orr r1, r0, #0xd7
msr cpsr_cxsf, r1
adr sp, irqstack
mrs r0, cpsr
bic r0, r0, #0x1f
orr r1, r0, #0xd2
msr cpsr_cxsf, r1
adr sp, irqstack
mrs r0, cpsr
bic r0, r0, #0x1f
orr r1, r0, #0xd1
msr cpsr_cxsf, r1
adr sp, irqstack
bic r0, r0, #0x1f
orr r1, r0, #0xd3
msr cpsr_cxsf, r1
ldr r0, stack_end
sub sp, r0, #4
mrs r0, cpsr
bic r0, r0, #0x80
msr cpsr, r0
/* jump to C code */
bl main
/* if main ever returns we just call it again */
b _trampoline
.global ticks
ticks: .word 1
bss_start: .word __bss_start
bss_end: .word __bss_end
stack_end: .word __stack_end
.space(12
irqstack: |
|