05-16 神奇的EVENT ERROR

普通运行没问题,但是一开debug log运行就会EVENT ERROR。

一开始怀疑是fork有问题,但反复调试后发现似乎没有影响;接下来又开始怀疑是中断嵌套的处理,但依旧没有问题;随后还怀疑了copy on write,依旧没有结果。

观察日志,发现每次错误都在fork的中断嵌套周围,即若fork前后发生中断嵌套,随后产生的子进程一旦被调度就会ERROR

之前一直怀疑是fork后中断会破坏栈上的数据,但在反复推理分析后发现问题出在fork前的中断。

我的中断嵌套处理会在syscall完后恢复current的context为原来的值,而倘若在fork运行前发生中断嵌套,则fork中会拷贝错误的context内容(此时current的context指针指向内核运行栈),因此运行就会导致Global Protection Fault

最后的解决方案如下:

if (task->backup_ctx != NULL)
            task->context = task->backup_ctx;

*(nt->context) = *(task->context);
nt->context->cr3 = cr3;
nt->context->rsp0 = rsp0;