答案说:在lab1_switch_to_user中,调用T_SWITCH_TOU中断。 注意从中断返回时,会多pop两位,并用这两位的值更新ss,sp,损坏堆栈。
所以用了
asm volatile ( "sub $0x8, %%esp \n" "int %0 \n" "movl %%ebp, %%esp" : : "i"(T_SWITCH_TOU) );
为什么我没有"sub $0x8, %%esp \n"这一句也能全过。