ULK 3rd 已经讲得很好了, 可惜还有未尽之处。Professional Linux® Kernel Architecture 把最后的味道榨干了。
来自2.6.34的代码
switch_to(prev, next, prev);
barrier();
/*
* this_rq must be evaluated again because prev may have moved
* CPUs since it called schedule(), thus the 'rq' on its stack
* frame will be invalid.
*/
finish_task_switch(this_rq(), prev);
后书讲到
switch_to(prev, next, prev);
相当于 prev = switch_to(prev,next) 这样prev在switch_to调用完后就变了,也就是finish_task_switch中的prev 和 switch_to(prev, next, prev)中的prev 不是同一个对象,这其中的魔术依赖于平台实现,本质就是操作栈,利用寄存器换掉栈中原来的prev。
阅读(888) | 评论(3) | 转发(0) |