繁体   English   中英

用不同的堆栈指针(gcc)调用C函数

[英]Call C function with different stack pointer (gcc)

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

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

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

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

请注意,这种方法非常昂贵(多个系统调用来更改堆栈),但是应该100%可移植到POSIX系统。 由于速度很慢,因此您可能想制作用汇编语言编写的特定于arch的调用堆栈堆栈函数,并且仅将我的通用解决方案用作尚未编写汇编版本的arch的后备。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM