免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2270 | 回复: 5

[内核模块] 关于arm的cpsr寄存器 [复制链接]

论坛徽章:
0
发表于 2013-11-09 14:57 |显示全部楼层
本帖最后由 xiaojsj 于 2013-11-09 14:57 编辑

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

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

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


叩谢!·

论坛徽章:
0
发表于 2013-11-09 15:23 |显示全部楼层
因当中断发生的时候我们先保存当前状态,等中断结束之后,就可以返回到当前状态,CPSR,SPSR就是起这个作用。

论坛徽章:
0
发表于 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


   

论坛徽章:
0
发表于 2013-11-09 15:37 |显示全部楼层
盼各位大牛过来不腻赐教啊:wink:

论坛徽章:
0
发表于 2013-11-09 15:47 |显示全部楼层
进程间的切换有让lr入栈操作,然后出栈就可以返回继续运行了,CPSR保存与否是看有没有状态的改变,需不需要返回当前状态,具体可看CPSR中每位表示的情况。

论坛徽章:
0
发表于 2013-11-09 16:12 |显示全部楼层
抽了根烟后,终于理解了为什么中断时需要保存cpsr,而上下文切换时不需要保存cpsr寄存器了。
因为中断发生是随机不确定的,他可能在任何指令的后面产生中断,而cpsr只会影响到中断指令的下面的
指令的执行,如果被中断时的指令的下一条指令的执行是依赖于cpsr的,如果中断处理程序修改了cpsr值,而又
没保存,会导致中断返回时,在执行下条指令时,会出现错误。

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


回复 5# zhangshuang2013


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP