Chinaunix

标题: 关于arm的cpsr寄存器 [打印本页]

作者: xiaojsj    时间: 2013-11-09 14:57
标题: 关于arm的cpsr寄存器
本帖最后由 xiaojsj 于 2013-11-09 14:57 编辑

各位大牛帮忙来解析下:
在进入中断时,arm的cpsr寄存器会保存到相应异常模式的cpsr私有备份寄存器中,

而在进程切换的时候,cpsr寄存器却不需要保存,这是原因呢?

保存cpsr寄存器的标准是什么呢?


叩谢!·
作者: zhangshuang2013    时间: 2013-11-09 15:23
因当中断发生的时候我们先保存当前状态,等中断结束之后,就可以返回到当前状态,CPSR,SPSR就是起这个作用。
作者: xiaojsj    时间: 2013-11-09 15:34
当我的理解是,当进程切换时,也是需要保存cpsr寄存器的啊?
那位什么最新我看的linux3.4.5版本的内核就没有对cpsr寄存器进行保存呢?

贴源码如下:
/*
* Register switch for ARMv3 and ARMv4 processors
* r0 = previous task_struct, r1 = previous thread_info, r2 = next thread_info
* previous and next are guaranteed not to be the same.
*/
ENTRY(__switch_to)
UNWIND(.fnstart        )
UNWIND(.cantunwind        )
        add        ip, r1, #TI_CPU_SAVE
        ldr        r3, [r2, #TI_TP_VALUE]
ARM(        stmia        ip!, {r4 - sl, fp, sp, lr} )        @ Store most regs on stack
THUMB(        stmia        ip!, {r4 - sl, fp}           )        @ Store most regs on stack
THUMB(        str        sp, [ip], #4                   )
THUMB(        str        lr, [ip], #4                   )
#ifdef CONFIG_CPU_USE_DOMAINS
        ldr        r6, [r2, #TI_CPU_DOMAIN]
#endif
        set_tls        r3, r4, r5
#if defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP)
        ldr        r7, [r2, #TI_TASK]
        ldr        r8, =__stack_chk_guard
        ldr        r7, [r7, #TSK_STACK_CANARY]
#endif
#ifdef CONFIG_CPU_USE_DOMAINS
        mcr        p15, 0, r6, c3, c0, 0                @ Set domain register
#endif
        mov        r5, r0
        add        r4, r2, #TI_CPU_SAVE
        ldr        r0, =thread_notify_head
        mov        r1, #THREAD_NOTIFY_SWITCH
        bl        atomic_notifier_call_chain
#if defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP)
        str        r7, [r8]
#endif
THUMB(        mov        ip, r4                           )
        mov        r0, r5
ARM(        ldmia        r4, {r4 - sl, fp, sp, pc}  )        @ Load all regs saved previously
THUMB(        ldmia        ip!, {r4 - sl, fp}           )        @ Load all regs saved previously
THUMB(        ldr        sp, [ip], #4                   )
THUMB(        ldr        pc, [ip]                   )
UNWIND(.fnend                )
ENDPROC(__switch_to)

回复 2# zhangshuang2013


   
作者: xiaojsj    时间: 2013-11-09 15:37
盼各位大牛过来不腻赐教啊:wink:
作者: zhangshuang2013    时间: 2013-11-09 15:47
进程间的切换有让lr入栈操作,然后出栈就可以返回继续运行了,CPSR保存与否是看有没有状态的改变,需不需要返回当前状态,具体可看CPSR中每位表示的情况。
作者: xiaojsj    时间: 2013-11-09 16:12
抽了根烟后,终于理解了为什么中断时需要保存cpsr,而上下文切换时不需要保存cpsr寄存器了。
因为中断发生是随机不确定的,他可能在任何指令的后面产生中断,而cpsr只会影响到中断指令的下面的
指令的执行,如果被中断时的指令的下一条指令的执行是依赖于cpsr的,如果中断处理程序修改了cpsr值,而又
没保存,会导致中断返回时,在执行下条指令时,会出现错误。

而上下文切换的返回地址和要执行的指令是确定的,只要上下文切换回来的指令不受cpsr值得影响,则就可以
不保存cpsr寄存器的值。


回复 5# zhangshuang2013


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2