且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

WinCE6.0学习之EBoot源码分析----startup.s(六)

更新时间:2022-09-27 23:14:12

;----------------------------------------------- 
;         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_MASKMode_IRQNOINT都在文件PLATFORM\COMMON\SRC\SOC\S3C6410_SEC_V1\OAL\INC\s3c6410.inc中定义。第二条语句用来清空表示处理器模式的低5位,第三条语句设置处理器模式为IRQ模式,同时禁止IRQFRQ中断。第四条语句执行前面的设置。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
    第一条语句,清除模式位,同时使能IRQFRQ中断,第二条语句设置处理器模式为特权模式,第三条语句执行前面的设置,最后一条语句保存特权模式下堆栈虚拟地址到SP
;------------------------------------ 
;         Jump to Main() "C" Routine 
;------------------------------------ 

                b                    main 
                b                    .                    ; Should no be here... 

        ENTRY_END 

;------------------------------------------------------------------------------ 
;         End of StartUp 
;------------------------------------------------------------------------------
    到这里基本上StartUP段代码就基本结束,最后一步用来跳转到C语言写的main函数处,“b  .“表示不断本地跳转,相当于while1),最后ENTRY_END呼应开始的LEAF_ENTRY宏,表明StartUP代码段的结束。

         好了,终于写完了,在startup.s文件中还包含了启动内核的Launch函数,这部分也是汇编书写的,但逻辑上属于main函数里面的,所以这里不做分析,到main函数中进行分析。



本文转自jazka 51CTO博客,原文链接:http://blog.51cto.com/jazka/572651,如需转载请自行联系原作者