;-----------------------------------------------
; MMU Enabled and Virtual Address is Valid from here
;-----------------------------------------------
VirtualStart
;--------------------------------------------------
; Initialize Stack
; Stack size and location information is in "image_cfg.inc"
;--------------------------------------------------
mrs r0, cpsr
bic r0, r0, #Mode_MASK
orr r1, r0, #Mode_IRQ | NOINT
msr cpsr_cxsf, r1 ; IRQMode
ldr sp, =IRQStack_VA ; IRQStack
; MMU Enabled and Virtual Address is Valid from here
;-----------------------------------------------
VirtualStart
;--------------------------------------------------
; Initialize Stack
; Stack size and location information is in "image_cfg.inc"
;--------------------------------------------------
mrs r0, cpsr
bic r0, r0, #Mode_MASK
orr r1, r0, #Mode_IRQ | NOINT
msr cpsr_cxsf, r1 ; IRQMode
ldr sp, =IRQStack_VA ; IRQStack
跳转到
VirtualStart
标号处后,先初始化堆栈。第一条语句
mrs
获取
CPSR
状态寄存器的值,并存储到
R0
中。
Mode_MASK
、
Mode_IRQ
、
NOINT
都在文件
PLATFORM\COMMON\SRC\SOC\S3C6410_SEC_V1\OAL\INC\s3c6410.inc
中定义。第二条语句用来清空表示处理器模式的低
5
位,第三条语句设置处理器模式为
IRQ
模式,同时禁止
IRQ
和
FRQ
中断。第四条语句执行前面的设置。
IRQStack_VA
在文件
image_cfg.inc
中定义,第五条语句将
IRQ
堆栈的虚拟地址保存在
SP
。
bic r0, r0, #Mode_MASK | NOINT
orr r1, r0, #Mode_SVC
msr cpsr_cxsf, r1 ; SVCMode
ldr sp, =SVCStack_VA ; SVCStack
orr r1, r0, #Mode_SVC
msr cpsr_cxsf, r1 ; SVCMode
ldr sp, =SVCStack_VA ; SVCStack
第一条语句,清除模式位,同时使能
IRQ
和
FRQ
中断,第二条语句设置处理器模式为特权模式,第三条语句执行前面的设置,最后一条语句保存特权模式下堆栈虚拟地址到
SP
。
;------------------------------------
; Jump to Main() "C" Routine
;------------------------------------
b main
b . ; Should no be here...
ENTRY_END
;------------------------------------------------------------------------------
; End of StartUp
;------------------------------------------------------------------------------
; Jump to Main() "C" Routine
;------------------------------------
b main
b . ; Should no be here...
ENTRY_END
;------------------------------------------------------------------------------
; End of StartUp
;------------------------------------------------------------------------------
到这里基本上StartUP段代码就基本结束,最后一步用来跳转到C语言写的main函数处,“b .“表示不断本地跳转,相当于while(1),最后ENTRY_END呼应开始的LEAF_ENTRY宏,表明StartUP代码段的结束。
好了,终于写完了,在startup.s文件中还包含了启动内核的Launch函数,这部分也是汇编书写的,但逻辑上属于main函数里面的,所以这里不做分析,到main函数中进行分析。
本文转自jazka 51CTO博客,原文链接:http://blog.51cto.com/jazka/572651,如需转载请自行联系原作者