8

我正在寻找一种在不同堆栈中调用 C 函数的方法,即保存当前堆栈指针,将堆栈指针设置到不同位置,调用该函数并在返回时恢复旧堆栈指针。

这样做的目的是为编程语言提供一个轻量级的线程系统。线程将在非常小的堆栈上运行,检查何时需要更多堆栈并动态调整其大小。这样可以在不浪费大量内存的情况下分配数千个线程。在调用 C 代码时,使用小堆栈是不安全的,因为 C 代码不知道检查和调整大小,所以我想使用一个大的 pthread 堆栈,它仅用于调用 C(在轻量级线程之间共享相同的 pthread)。

现在我可以编写可以正常工作的汇编代码存根,但我想知道是否有更好的方法来做到这一点,例如 gcc 扩展或已经实现它的库。如果没有,那么我想我会把头埋在 ABI 和汇编语言手册中;-) 我只是出于懒惰而不想重新发明轮子而问这个问题。

4

1 回答 1

2

假设您正在使用 POSIX 线程并且在 POSIX 系统上,您可以使用信号来实现这一点。设置备用信号处理堆栈 ( sigaltstack) 并指定一个特殊的实时信号,使其处理程序在备用信号堆栈上运行。然后raise信号切换到堆栈,并让信号处理程序从线程本地数据中读取要调用的函数和传递的参数的数据。

请注意,这种方法相当昂贵(更改堆栈的多个系统调用),但应该 100% 可移植到 POSIX 系统。由于它很慢,您可能希望使用汇编语言编写特定于拱门的调用 alt-stack 函数,并且只使用我的通用解决方案作为您尚未编写汇编版本的拱门的后备方案。

于 2012-06-20T01:36:32.777 回答