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

;-----------------------------------------------
;         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函数中进行分析。

你可能感兴趣的:(源码,职场,WinCE,休闲,EBoot,startup.s)