;-----------------------------------------------
; 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
第一条语句,清除模式位,同时使能IRQ和FRQ中断,第二条语句设置处理器模式为特权模式,第三条语句执行前面的设置,最后一条语句保存特权模式下堆栈虚拟地址到SP。
;------------------------------------
; 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,如需转载请自行联系原作者