U-boot包括自主模式和开发模式。
异常向量表 Exceptions
由于处理器内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理发生的异常事件。
当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址,去执行异常处理程序,而这个固定地址,就称之为异常向量。
;;异常向量表
_start:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefectch_abort
ldr pc, _data_abort
ldr pc, _not_used ; 占用一个指令地址
ldr pc, _irq
ldr pc, _fiq
start.S
.text
.global _start
_start:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefectch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
ldr pc, _reset
_undefined_instruction: .word undefined_instruction
_software_interrupt : .word software_interrupt
_prefectch_abort: .word prefectch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
_reset: .word reset
undefined_instruction:
nop
software_interrupt:
nop
prefectch_abort:
nop
data_abort:
nop
not_used:
nop
irq:
nop
fiq:
nop
reset:
nop
boot.lds
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS{
. = 0x20008000
. = ALIGN(4);
.text:
{
start.o(.text)
*(.text)
}
. = ALIGN(4);
.data:
{
*(.data)
}
. = ALIGN(4);
bss_start=.;
.bss:
{
*(.bss)
}
bss_end=.;
}
Makefile
有些芯片的bootloader写完后,需要加上header字段,包含checksum, BL1长度等
处理器模式 Processor Mode
.text
.global _start
_start:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefectch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
ldr pc, _reset
_undefined_instruction: .word undefined_instruction
_software_interrupt : .word software_interrupt
_prefectch_abort: .word prefectch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
_reset: .word reset
undefined_instruction:
nop
software_interrupt:
nop
prefectch_abort:
nop
data_abort:
nop
not_used:
nop
irq:
nop
fiq:
nop
reset:
bl set_svc_irq_firq
set_svc_irq_firq:
mrs r0, cprs ;将cprs内容复制到r0
bic r0, r0, #0x1f ;将r0中的掩码0x1f的5位置0
orr r0, r0, #0xd3 ;将掩码0xd3标注位置1,也就是关闭IRQ,FIRQ,置处理器为SVC模式
msr cprs, r0 ;将r0内容写回CPRS
mov pc, lc ; 返回地址赋值给PC
关闭看门狗 disable WatchDog
reset:
bl diable_watchdog
#define pWTCON 0x53000000
disable_watchdog:
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]
mov pc, lc
屏蔽中断 disable interrupt
reset:
bl diable_interrupt
disable_interrupt:
ldr r0, =0x4a000008
mvn r1, #0x0
str r1, [r0]
mov pc, lc
关闭MMU,CACHE
MMU,cache都是由CP15协处理器来控制
cache分为 I-cache和D-cache
1,使i-cache和d-cache失效
2,关闭D-cache和MMU, 主要是关闭D-CACHE, I-CACHE可以不做处理
disable_mmu_cache:
mcr p15,0,r0,c7,c7,0
mrc p15,0,r0,c1,c0,0
bic r0, r0, #0x00000007
mcr p15,0,r0,c1,c0,0
mov pc, lc