我试图了解linux的上下文切换是如何工作的,基于ARM。
所以我想了解以下代码。
ENTRY(__ switch_to)
private void updateUI(Intent intent) {
int counter = intent.getIntExtra("counter");
Log.d("SERVICE_SECONDS", Integer.toString(counter));
}
据我所知,这些代码用于存储当前进程的cpu-context,并为下一个进程恢复cpu-context,这将是当前进程。但它不保存和恢复关于ip,r1,r2,r3,r4,尤其是关于cpsr(当前程序状态寄存器)。
我认为应该为Context Switch保存和恢复cpsr寄存器。但它不会在上面的代码中保存cpsr。我不明白这一点。我正在努力解决这个问题一个星期。但我找不到答案。非常感谢有人给我答案。
答案 0 :(得分:2)
当Here is a link just in case时,它只是一个常规的函数调用。 ABI不需要在函数调用中保留r0-r3,r12或CPSR中的条件标志,因此它们不需要保存在调用任务的上下文中,因为它赢了&# 39;当它最终被重新安排时,要关心它们是什么,并在从switch_to()
返回时再次接受。
点是,cpu_context
中的thread_info
,这里切换的是内核状态,最终调用{{1} }}。实际(用户空间)进程状态 * ,即r0-r15,SPSR等位于任务__schedule()
中 - 该状态已保存在进入内核后立即(参见例如pt_regs
)并在退出时(vector_swi
)以您期望的方式恢复。
*假设有一个,即调用上下文不是内核线程。