Linux 2.6.11 的核心上下文切换可以简化如下:
mov prev,%eax //eax指向prev
mov next,%edx //edx指向next
pushfl //满足编译器 pushl %ebp //满足编译器
movl %esp,484(%eax) //保存esp in prev
movl 484(%edx), %esp //从下一个
movl 加载 esp $1f, 480(%eax) //将 1f 保存在 prev
pushl 480(%edx) //push 1f
jmp __switch_to
1: popl %ebp
popfl
现在,让我们看一下__switch_to中的相关代码。它从 eax 和 edx 寄存器中获取 prev_p 和 next_p 参数。做了很多工作,并以
movl %edi,%eax ret
我的问题是:为什么需要通过指令 movl $1f, 480(%eax) 节省 $1f ???据我所知,地址 $1f 是一个常量,由编译器固定,在执行过程中不会改变。因此,保存它没有意义。此外,最重要的是,afaik switch_to 宏仅在源代码中的一处使用。
第二个问题是:为什么在通过 pushl 480(%edx) 推入 $1 后跳转到 __switch_to 是必要的?如果我们只是通过调用指令定期调用它,__switch_to 将返回到 $1 好吧。