我正在寻找一种在不同堆栈中调用C函数的方法,即保存当前堆栈指针,将堆栈指针设置到其他位置,调用函数并在返回时恢复旧堆栈指针。 / p>
这是一个用于编程语言的轻量级线程系统。线程将在非常小的堆栈上运行,检查何时需要更多堆栈并动态调整其大小。这样就可以分配数千个线程而不会浪费大量内存。当调用C代码时,使用一个很小的堆栈是不安全的,因为C代码不知道检查和调整大小,所以我想使用一个大的pthread堆栈,它只用于调用C(在轻量级线程之间共享)相同的pthread)。
现在我可以编写可以正常工作的汇编代码存根,但我想知道是否有更好的方法来执行此操作,例如gcc扩展或已经实现它的库。如果没有,那么我想我会把我的头埋在ABI和汇编语言手册中;-)我只是因为懒惰而不想重新发明这个问题。
答案 0 :(得分:2)
假设您正在使用POSIX线程并且在POSIX系统上,您可以通过信号实现此目的。设置备用信号处理堆栈(sigaltstack
)并指定一个特殊的实时信号,使其处理程序在备用信号堆栈上运行。然后raise
信号切换到堆栈,让信号处理程序从线程本地数据中读取要调用的函数的数据,以及传递它的参数。
请注意,此方法相当昂贵(多个系统调用更改堆栈),但应该100%可移植到POSIX系统。由于速度很慢,您可能希望使用汇编语言编写特定于arch的call-on-alt-stack函数,并且只使用我的通用解决方案作为尚未编写汇编版本的archs的后备。