我想了解基于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。我不明白这一点。我在这个问题上挣扎了一个星期。但我找不到答案。非常感谢有人给我答案。
ARM32有*存储寄存器*。在异常输入时'CPSR'被保存到'SPSR'中,并被异常返回恢复。我建议阅读架构参考手册了解更多信息。 – EOF
_“我认为它应该保存和恢复cpsr寄存器的上下文切换”_ - 你为什么这么想?这是切换任务的内核端上下文;谁说是否它甚至是用户线程呢?在内核中调用'schedule()'的任何人都不会期望参数寄存器和条件标志被保留。听起来好像你可能将它与'ret_to_user()'混为一谈。 – Notlikethat
首先感谢您的评论。我不确定在linux中只有用户进程。如果是这样,我认为可以不保存cpsr。那么系统调用处理程序(svc处理程序)会使用内核堆栈保存并恢复类似“ret_to_user”的cpsr。但如果存在多个内核进程,则在这些内核进程之间存在上下文切换的情况。所以我认为它需要保存和恢复CPSR。你怎么看待这个? – attila