由于某种原因,我切换堆栈以调用我的应用程序中的某些函数。为此,我使用 makecontext / getcontext / swapcontext 。但是,我发现它太慢了。 我试图为此目的使用自定义代码,它保存堆栈指针和其他寄存器,然后为堆栈指针分配我想用作堆栈的新内存的值。但是,我一直在堆栈粉碎检测到错误。
操作系统是否为堆栈设置了一些特殊权限,或者这里有什么问题?如何规避问题。
答案 0 :(得分:3)
优秀的GNU Pth库大量使用这些技术。它有很好的文档记录,并在编译时确定最有效的上下文切换机制。实际上在配置时编辑。
作者的论文:rse-pmt.ps
给出了用户空间上下文切换和相关问题的技术说明 - 替代信号栈等。
答案 1 :(得分:2)
你可以看看其他软件做同样的肮脏技巧。特别是Chicken Scheme。在目标longjmp
上手动执行脏操作后,您可能会考虑使用jmp_buf
。当然,这些都不是便携式的。
但请解释更多您的总体目标。你的问题一般都太神秘了...... (这对某些人来说是令人厌恶的)
答案 2 :(得分:1)
makecontext()/getcontext()/setcontext()/swapcontext() 非常有效因为它们只是保存处理器寄存器的当前值。但是,至少在 Linux/GLIBC 中,setcontext() 和 getcontext() 调用 rt_sigprocmask() 系统调用来保存/恢复信号调用线程的掩码。这可能是您面临一些性能问题的原因,因为这会触发上下文切换到内核。