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