- 假若我们的__current->intr_ctx注入了一半,然后产生page-fault中断,
- 那么这就会导致我们的__current->intr_ctx被这个page-fault中断导致的
- 上下文信息覆盖。那么当page-fault handler成功分配了一个页,返回,
- 拷贝也就得以进行。遗憾的是,只不过这次拷贝的内容和前面的拷贝是没有任何的关系
- (因为此时的intr_ctx已经不是之前的intr_ctx了!)
- 而这就会导致我们保存在信号上下文中的进程上下文信息不完整,从而在soft_iret时
- 触发#GP。
-
- 解决办法就是先吧intr_ctx拷贝到一个静态分配的区域里,然后再注入到用户栈。
- */
- static volatile struct proc_sigstate __temp_save;
- __temp_save.proc_regs = __current->intr_ctx;
- memcpy(__temp_save.fxstate, __current->fxstate, 512);
-
- sig_ctx->prev_context = __temp_save;
-
- sig_ctx->sig_num = sig_selected;
- sig_ctx->signal_handler = __current->sig_handler[sig_selected];
-
- if (!sig_ctx->signal_handler) {
- // 如果没有用户自定义的Handler,则使用系统默认Handler。
- sig_ctx->signal_handler = default_handlers[sig_selected];
- }