2016-08-25 105 views
0

我想了解基于ARM的linux的上下文切换是如何工作的。如何理解“__swtich_ to”在ARM linux中的contex-switch的功能

所以我想了解下面的代码。

ENTRY(__ switch_to)

add ip, r1, #TI_CPU_SAVE 
ldr r3, [r2, #TI_TP_VALUE] 
stmia ip!, {r4 - sl, fp, sp, lr} @ Store most regs on stack 

ldr r6, [r2, #TI_CPU_DOMAIN] 
strex r5, r4, [ip]   @ Clear exclusive monitor 

mcr p15, 0, r3, c13, c0, 3  @ set TLS register 

mov r4, #0xffff0fff 
str r3, [r4, #-15]   @ TLS val at 0xffff0ff0 

mcr p15, 0, r6, c3, c0, 0  @ Set domain register 
mov r5, r0 
add r4, r2, #TI_CPU_SAVE 
ldr r0, =thread_notify_head 
mov r1, #THREAD_NOTIFY_SWITCH 
bl atomic_notifier_call_chain 
mov r0, r5 
ldmia r4, {r4 - sl, fp, sp, pc} @ Load all regs saved previously 

据我所知,这些代码用于存储CPU的上下文当前进程和恢复CPU的上下文下一个过程,这将是当前进程。但它不保存和恢复关于ip,r1,r2,r3,r4,特别是关于cpsr(当前程序状态寄存器)。

我认为它应该保存并恢复上下文切换的cpsr寄存器。但它不会在上面的代码中保存cpsr。我不明白这一点。我在这个问题上挣扎了一个星期。但我找不到答案。非常感谢有人给我答案。

+0

ARM32有*存储寄存器*。在异常输入时'CPSR'被保存到'SPSR'中,并被异常返回恢复。我建议阅读架构参考手册了解更多信息。 – EOF

+0

_“我认为它应该保存和恢复cpsr寄存器的上下文切换”_ - 你为什么这么想?这是切换任务的内核端上下文;谁说是否它甚至是用户线程呢?在内核中调用'schedule()'的任何人都不会期望参数寄存器和条件标志被保留。听起来好像你可能将它与'ret_to_user()'混为一谈。 – Notlikethat

+0

首先感谢您的评论。我不确定在linux中只有用户进程。如果是这样,我认为可以不保存cpsr。那么系统调用处理程序(svc处理程序)会使用内核堆栈保存并恢复类似“ret_to_user”的cpsr。但如果存在多个内核进程,则在这些内核进程之间存在上下文切换的情况。所以我认为它需要保存和恢复CPSR。你怎么看待这个? – attila

回答

2

context_switch() calls switch_to(),它只是一个常规的函数调用。 ABI不需要将r0-r3,r12或CPSR中的条件标志保留在一个函数调用上,因此它们不需要保存在调用任务的上下文中,因为它不会关心它们是什么是从switch_to()返回时最终被重新安排并再次提取。

的一点是,在thread_info,这是什么正在这里切换cpu_context,无论是最终调用到__schedule()内核状态。实际(用户空间)过程状态*,即R0-R15,SPSR等是在任务的pt_regs - 在进入内核紧接该状态被保存(见例如vector_swi),并在退出时恢复(ret_to_user)以你期望的方式。

*假设有一个,即调用上下文不是内核线程。

+0

再次感谢您的评论。 我知道参数寄存器(R0〜R3)和IP(R12)不需要保存。 但我还是不明白CPSR中的条件标志是通过函数调用保留的。 – attila

+0

事实是CPSR不需要在context-switch之间保留,因为linux运行良好。我可能是错的或错过了一些东西。 无论如何,我已阅读ABI文件,因为您已经建议我。 非常密切的评论是“插入的任何单板必须保存除IP(r12)和条件代码标记”<== 5.3.1.1使用IP由链接器 – attila

+0

所有寄存器的内容尽管提到ABI文档,我不' t仍然明白。我试图反汇编vmlinux。但我找不到答案。你能详细解释一下你的评论:“CPSR中的条件标志是通过函数调用保存的。”我真的很想知道这个。 另一个问题是......你是否同意在内核进程之间有上下文切换的情况。在这种情况下,是否需要不保存cpsr?我可能是错的或错过了一些东西。给我的建议或答案会有所帮助。 在此先感谢。 – attila