如何理解ARM linux中contex-switch的“__swtich_ to”功能

时间:2016-08-25 09:00:25

标签: linux arm context-switch

我试图了解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。我不明白这一点。我正在努力解决这个问题一个星期。但我找不到答案。非常感谢有人给我答案。

1 个答案:

答案 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)以您期望的方式恢复。

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