下面是一个中断
- Assembly code
sys_call: call save sti call [sys_call_table + eax * 4] mov [esi + EAXREG - P_STACKBASE], eax cli ret ;iretd
最后的ret指令我觉得应该是iretd,当发生中断时eflags会压栈的所以直接ret会有问题的吧
------解决方案--------------------------------------------------------
查看save函数的内容,这本书是抄的minix的代码,你可以翻阅minix源码看到save函数的工作情况,它已经修改当前栈并增加了一个调用帧,所以后面的ret并不是中断返回,而是通过那个调用帧跳到准备最后清理工作和中断返回的位置。
上面所说的应当使用iretd和最后一个cli指令是多余的也都是错误的,这设计操作系统原子操作的基本知识,也没什么好解释的。