reset內容(start.S文件):
1、設置svc模式
設置處理器的模式為svc模式,根據ARM架構參考手冊,處理器有七種工作模式:
在程序狀態(tài)寄存器講模式設置為10011:
匯編代碼如下:
set_svc:
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0xd3
msr cpsr, r0
mov pc,lr
2、關閉看門狗
在對應的芯片手冊(我用的是S3C2440)找到看門狗相關的寄存器,并關閉看門狗定時器輸出的復位信號:
對應匯編代碼:
disable_watchdog:
ldr r0, #pWTCON
mov r1, #0x0
str r1, [r0]
mov pc,lr
3、關閉中斷
找到對應芯片的中斷屏蔽寄存器,并關閉中斷:
對應匯編代碼:
disable_interrupt:
mvn r1, #0x0
ldr r0, #4A000008
str r1, [r0]
mov pc,lr
4、關閉mmu和catch
主要包括:(1)使I/D catch內容失效(2)關閉mmu和I/D catch
在ARM920T(ARM9)參考手冊找到相關寄存器,主要是寄存器1和寄存器7,并進行相應設置:
對應匯編代碼:
disable_mmu:
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,lr
完整代碼:
.text
.global _start
_start:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
undefined_instruction:
nop
software_interrupt:
nop
prefetch_abort:
nop
data_abort:
nop
not_used:
nop
irq:
nop
fiq:
nop
reset:
bl set_svc
bl disable_watchdog
bl disable_interrupt
bl disable_mmu
set_svc:
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0xd3
msr cpsr, r0
mov pc,lr
#define pWTCON 0x53000000
disable_watchdog:
ldr r0, #pWTCON
mov r1, #0x0
str r1, [r0]
mov pc,lr
disable_interrupt:
mvn r1, #0x0
ldr r0, #4A000008
str r1, [r0]
mov pc,lr
disable_mmu:
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,lr