- 论坛徽章:
- 13
|
回复 14# amarant
schedule()确实在restore_all之前调用:
- ENTRY(ret_from_intr)
- GET_CURRENT(%ebx)
- movl EFLAGS(%esp), %eax
- movb CS(%esp), %al
- testl $(VM_MASK|3), %eax
- jne ret_with_reschedule
- jmp restore_all
复制代码
为什么切换之前,要push esi、edi、dbp ?
- #define switch_to(prev,next,last) do { \
- asm volatile("pushl %%esi\n\t" \
- "pushl %%edi\n\t" \
- "pushl %%ebp\n\t" \
- "movl %%esp,%0\n\t" /* save ESP */ \
- "movl %3,%%esp\n\t" /* restore ESP */ \
- "movl $1f,%1\n\t" /* save EIP */ \
- "pushl %4\n\t" /* restore EIP */ \
- "jmp __switch_to\n" \
- "1:\t" \
- "popl %%ebp\n\t" \
- "popl %%edi\n\t" \
- "popl %%esi\n\t" \
- :"=m" (prev->thread.esp),"=m" (prev->thread.eip), \
- "=b" (last) \
- :"m" (next->thread.esp),"m" (next->thread.eip), \
- "a" (prev), "d" (next), \
- "b" (prev)); \
- } while (0)
复制代码
|
|