2

由于某种原因,我切换堆栈以在我的应用程序中调用某些函数。为此,我使用makecontext/getcontext/swapcontext。但是,我发现它太慢了。为此,我尝试使用定制代码,它保存堆栈指针和其他寄存器,然后为堆栈指针分配我想用作堆栈的新内存的值。但是,我不断收到堆栈粉碎检测到的错误。

操作系统是否为堆栈设置了一些特殊权限,否则这里有什么问题?如何规避问题。

4

3 回答 3

3

优秀的GNU Pth库大量使用了这些技术。它有很好的文档记录,并在编译时确定了最有效的上下文切换机制。编辑:实际上在配置时。

作者的论文:rse-pmt.ps给出了用户空间上下文切换和相关问题的技术说明——替代信号栈等。

于 2011-11-25T11:20:38.337 回答
2

你可以看看其他软件做同样的肮脏把戏。特别是养鸡计划。您可能会考虑longjmp在目标上手动做脏事后使用jmp_buf。当然,这些都不是便携式的。

但请多解释一下您的总体目标。你的问题通常太神秘了......(这对某些人来说是令人反感的)

于 2011-11-25T11:17:52.627 回答
1

makecontext() / getcontext () / setcontext() / swapcontext()非常有效,因为它们只是保存处理器寄存器的当前值。然而,至少在 Linux/GLIBC 中,setcontext()getcontext()调用rt_sigprocmask()系统调用来保存/恢复调用线程的信号掩码。这可能是您面临一些性能问题的原因,因为这会触发上下文切换到内核。

于 2021-01-18T15:50:58.950 回答