8

別のスタックでC関数を呼び出す方法を探しています。つまり、現在のスタックポインターを保存し、スタックポインターを別の場所に設定し、関数を呼び出して、戻ってきたときに古いスタックポインターを復元します。

これの目的は、プログラミング言語用の軽量スレッドシステムです。スレッドは非常に小さなスタックで動作し、さらにスタックが必要になるタイミングを確認して、動的にサイズを変更します。これは、多くのメモリを無駄にすることなく、何千ものスレッドを割り当てることができるようにするためです。Cコードを呼び出すときは、小さなスタックを使用するのは安全ではありません。Cコードはチェックとサイズ変更を認識していないため、Cの呼び出しにのみ使用される大きなpthreadスタックを使用したいと思います(同じpthread)。

これで、正常に動作するアセンブリコードスタブを作成できましたが、gcc拡張機能や、すでに実装されているライブラリなど、これを行うためのより良い方法があるかどうか疑問に思いました。そうでなければ、私は頭をABIとアセンブリ言語のマニュアルに埋め込んでしまうと思います;-)私は怠惰からこれを尋ねるだけで、車輪の再発明をしたくありません。

4

1 に答える 1

2

POSIX スレッドと POSIX システムを使用していると仮定すると、シグナルを使用してこれを実現できます。代替シグナル処理スタック ( sigaltstack) をセットアップし、1 つの特別なリアルタイム シグナルを指定して、そのハンドラーを代替シグナル スタックで実行します。次にraise、シグナルをスタックに切り替え、シグナル ハンドラーに、呼び出す関数のデータと、それに渡す引数のデータをスレッド ローカル データから読み取らせます。

このアプローチはかなりコストがかかります (スタックを変更するための複数のシステム コール) が、POSIX システムに 100% 移植可能であることに注意してください。遅いので、アセンブリで記述されたアーキテクチャ固有の call-on-alt-stack 関数を作成し、アセンブリ バージョンを記述していないアーキテクチャのフォールバックとしてのみ私の一般的なソリューションを使用することをお勧めします。

于 2012-06-20T01:36:32.777 に答える