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