簡體   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