首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在x86中恢复堆栈帧

在x86中恢复堆栈帧
EN

Stack Overflow用户
提问于 2016-10-14 22:11:24
回答 1查看 298关注 0票数 2

我正在尝试编写一个将信号实现到xv6中的程序

我已经想出了如何操作堆栈(我认为),我只是在恢复它时遇到了困难。这是我的信号传送代码:

此功能在处理堆栈中添加信号帧,并保存易失性寄存器。

代码语言:javascript
复制
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)中,我在恢复陷阱帧过程时遇到了问题。

我恢复框架的尝试是:

代码语言:javascript
复制
    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));

谁能给我指明正确的方向?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-19 02:31:16

代码语言:javascript
复制
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)); 
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40052706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档