C-Funktion mit anderem Stack-Pointer aufrufen (gcc)

8

Ich suche nach einer Möglichkeit, eine C-Funktion in einem anderen Stapel aufzurufen, dh den aktuellen Stapelzeiger zu speichern, den Stapelzeiger auf eine andere Position zu setzen, die Funktion aufzurufen und den alten Stapelzeiger wiederherzustellen, wenn er zurückkehrt / p>

Der Zweck ist ein leichtgewichtiges Threading-System für eine Programmiersprache. Threads arbeiten auf sehr kleinen Stapeln, prüfen, wann mehr Stack benötigt wird und passen die Größe dynamisch an. Dies ist so, dass Tausende von Threads zugewiesen werden können, ohne viel Speicher zu verschwenden. Wenn C-Code aufgerufen wird, ist es nicht sicher, einen winzigen Stack zu verwenden, da der C-Code nichts über das Überprüfen und Ändern der Größe weiß. Daher möchte ich einen großen Pthread-Stack verwenden, der nur zum Aufruf von C verwendet wird das gleiche Pthread).

Nun könnte ich Assembler-Code-Stubs schreiben, die gut funktionieren, aber ich habe mich gefragt, ob es eine bessere Möglichkeit gibt, dies zu tun, wie eine gcc-Erweiterung oder eine Bibliothek, die es bereits implementiert. Wenn nicht, dann denke ich, dass ich meinen Kopf in ABI und Handbüchern für die Assemblersprache vergraben habe ;-) Ich frage das nur aus Faulheit und möchte das Rad nicht neu erfinden.

    
Luke McCarthy 20.06.2012, 01:32
quelle

1 Antwort

2

Wenn Sie POSIX-Threads und ein POSIX-System verwenden, können Sie dies mit Signalen erreichen. Richten Sie einen alternativen Signalverarbeitungsstapel ein ( sigaltstack ) und geben Sie ein spezielles Echtzeit-Signal an, damit der Handler auf dem alternativen Signalstapel ausgeführt wird. Dann raise das Signal, um zum Stack zu wechseln, und der Signal-Handler liest die Daten, welche Funktion aufgerufen werden soll, und welches Argument, um es zu übergeben, aus thread-lokalen Daten.

Beachten Sie, dass dieser Ansatz ziemlich teuer ist (mehrere Systemaufrufe zum Ändern von Stacks), aber zu POSIX-Systemen zu 100% portabel sein sollte. Da es langsam ist, möchten Sie vielleicht arch-spezifische Call-on-Alt-Stack-Funktionen in Assembly schreiben und nur meine allgemeine Lösung als Ersatz für Archs verwenden, für die Sie keine Assembly-Version geschrieben haben.

    
R.. 20.06.2012 01:36
quelle

Tags und Links