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