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