我正在尝试编写一个将信号实现到xv6中的程序
我已经想出了如何操作堆栈(我认为),我只是在恢复它时遇到了困难。这是我的信号传送代码:
此功能在处理堆栈中添加信号帧,并保存易失性寄存器。
void signal_deliver(int signum)
{
*((uint*) (proc->tf->esp-4)) = proc->tf->eip;
*((uint*) (proc->tf->esp-8)) = proc->tf->eax;
*((uint*) (proc->tf->esp-12)) = proc->tf->ecx;
*((uint*) (proc->tf->esp-16)) = proc->tf->edx;
*((uint*) (proc->tf->esp-20)) = signum;
*((uint*) (proc->tf->esp-24)) = *(uint*) proc -> signal_trampoline;
proc->tf->esp = proc->tf->esp-24;
proc->tf->eip = (uint) (proc->signal_handlers[signum]);
}在我的void signal_return(void)中,我在恢复陷阱帧过程时遇到了问题。
我恢复框架的尝试是:
proc->tf->esp = proc->tf->esp + 24;
*((uint*)(proc->tf->esp - 16)) = proc->tf->esp;
*((uint*)(proc->tf->esp - 12)) = proc->tf->esp;
*((uint*)(proc->tf->esp - 8)) = proc->tf->esp;
proc->tf->eip = *((uint*)(proc->tf->esp - 4));谁能给我指明正确的方向?
发布于 2016-10-19 02:31:16
void signal_return(void) {
proc->tf->esp = proc->tf->esp + 24;
proc->tf->edx = *((uint*)(proc->tf->esp - 16));
proc->tf->ecx = *((uint*)(proc->tf->esp - 12));
proc->tf->eax = *((uint*)(proc->tf->esp - 8));
proc->tf->eip = *((uint*)(proc->tf->esp - 4));
}https://stackoverflow.com/questions/40052706
复制相似问题