- 论坛徽章:
- 7
|
本帖最后由 smalloc 于 2013-12-09 15:07 编辑
有一纰漏。
如果一定要有个进程与进程的分界线,那么stack的切换是就是进程切换的标志。
__switch_to中换了esp,那么这个指令前后的指令访问的是2个不同的stack,而schedule()函数换栈前后在后面的指令不应该依赖前面的栈空间(因为调度前后2代码的执行路径不同),但可改写。
i386中栈切换包含2个寄存器,esp和ebp, ebp的切换主要是保证schedule()返回后按新进程的schedule()入口返回。这里对EIP的操作似乎不产生影响- #define switch_to(prev,next,last) do { \
- unsigned long esi,edi; \
- asm volatile("pushl %%ebp\n\t" \
- "movl %%esp,%0\n\t" /* save ESP */ \
- "movl %5,%%esp\n\t" /* restore ESP */ \
- "movl $1f,%1\n\t" /* save EIP */ \
- "pushl %6\n\t" /* restore EIP */ \
- "jmp __switch_to\n" \
- "1:\t" \
- "popl %%ebp\n\t" \
- :"=m" (prev->thread.esp),"=m" (prev->thread.eip), \
- "=a" (last),"=S" (esi),"=D" (edi) \
- :"m" (next->thread.esp),"m" (next->thread.eip), \
- "2" (prev), "d" (next)); \
- } while (0)
复制代码 |
|