裸奔的bootloader单步调试

2011-03-01 23:25:22

 

       目地:更清晰的了解bootloader的结构及功能。为移植U-boot打基础。

       以前只知道大概,今天利用IAR调试工具,看着汇编代码,看着寄存器,看着内存。来单步调试bootloader。把之前不明白的地方都搞明白。

        今天单步走到了初始化堆栈。主要研究了设置memory寄存器及初始化堆栈。不过还有一个问题,为什么要用DCD分配内存空间。不能用为WATCHDOG寄存器赋值的方法来给BWSCON来赋值?貌似和内存映像相关。明天要搞明白。

裸奔的bootloader单步调试

 

一:设置memory寄存器 (见上图)

二:初始化堆栈

InitStacks
 ;Don't use DRAM,such as stmfd,ldmfd......
 ;SVCstack is initialized before
 ;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
 mrs r0,cpsr
 bic r0,r0,#MODEMASK
 orr r1,r0,#UNDEFMODE|NOINT
 msr cpsr_cxsf,r1  ;UndefMode
 ldr sp,=UndefStack  ; UndefStack=0x33FF_5C00

 orr r1,r0,#ABORTMODE|NOINT
 msr cpsr_cxsf,r1  ;AbortMode
 ldr sp,=AbortStack  ; AbortStack=0x33FF_6000

 。。。。。

 bic r0,r0,#MODEMASK|NOINT
 orr r1,r0,#SVCMODE
 msr cpsr_cxsf,r1  ;SVCMode
 ldr sp,=SVCStack  ; SVCStack=0x33FF_5800 

    这段代码我当初的理解是为修改cpsr的值,然后把各种模式的堆栈值存入sp。运行到最后那么就只为SVCStack赋值了。现在看来这真是天大的笑话。根据下图可知:不同模式有自己单独的sp(即R13寄存器)常作为栈指针。上面代码就是先设置模式,然后再在此模式下,初始化R13寄存器。

裸奔的bootloader单步调试

 

     每一种异常模式都有自己担任R12,应用程序初始化该R13,使其指向该异常模式专用的栈地址。当进入异常模式时,可以将需要使用的寄存器保存在R13所指的栈中,当退出异常处理程序时,将保存在R13所指的栈中的寄存器值弹出,这样就使异常处理程序不会破坏被其中断程序的运行现场。 

 

上一篇:ARM架构之异常与中断


下一篇:iOS 底层(三)-状态寄存器