2012-06-20 17 views
8

के साथ कॉल सी फ़ंक्शन मैं एक अलग स्टैक में सी फ़ंक्शन को कॉल करने का एक तरीका ढूंढ रहा हूं, यानी वर्तमान स्टैक पॉइंटर को सहेजें, स्टैक पॉइंटर को किसी दूसरे स्थान पर सेट करें, फ़ंक्शन को कॉल करें और पुरानी स्टैक पॉइंटर को लौटाते समय पुनर्स्थापित करें।विभिन्न स्टैक पॉइंटर (जीसीसी)

इसका उद्देश्य प्रोग्रामिंग भाषा के लिए एक हल्के थ्रेडिंग सिस्टम है। थ्रेड बहुत छोटे ढेर पर काम करेंगे, जांचें कि अधिक स्टैक की आवश्यकता है और गतिशील रूप से इसका आकार बदलना है। ऐसा इसलिए है कि बहुत सारी स्मृति बर्बाद किए बिना हजारों धागे आवंटित किए जा सकते हैं। सी कोड में कॉल करते समय एक छोटे स्टैक का उपयोग करना सुरक्षित नहीं है, क्योंकि सी कोड को जांच और आकार बदलने के बारे में पता नहीं है, इसलिए मैं केवल एक बड़े pthread स्टैक का उपयोग करना चाहता हूं जिसका उपयोग केवल सी को कॉल करने के लिए किया जाता है (हल्के धागे के बीच साझा किया जाता है एक ही pthread)।

अब मैं असेंबली कोड स्टब्स लिख सकता हूं जो ठीक काम करेगा, लेकिन मुझे आश्चर्य हुआ कि ऐसा करने का एक बेहतर तरीका है, जैसे जीसीसी एक्सटेंशन या लाइब्रेरी जो पहले से ही लागू करती है। यदि नहीं, तो मुझे लगता है कि मेरे सिर को एबीआई और असेंबली भाषा मैनुअल में दफनाया जाएगा ;-) मैं केवल आलस्य से यह पूछता हूं और पहिया को फिर से शुरू नहीं करना चाहता हूं।

+0

क्लोन सिस्कल का उपयोग करके आप अपने स्वयं के "धागे" को व्यक्तिगत स्टैक्स के साथ कार्यान्वित कर सकते हैं। यदि आप libc wrapper के बजाय प्रत्यक्ष सिस्टम कॉल का उपयोग करते हैं, तो यह बहुत अधिक कांटा की तरह काम करता है सिवाय इसके कि आप निर्दिष्ट कर सकते हैं कि कौन से संसाधन और नामस्थान साझा किए गए हैं। – technosaurus

उत्तर

2

मान लें कि आप POSIX धागे और POSIX सिस्टम पर उपयोग कर रहे हैं, तो आप इसे सिग्नल के साथ प्राप्त कर सकते हैं। एक वैकल्पिक सिग्नल हैंडलिंग स्टैक सेट करें (sigaltstack) और वैकल्पिक सिग्नल स्टैक पर अपने हैंडलर चलाने के लिए एक विशेष रीयल-टाइम सिग्नल निर्दिष्ट करें। फिर raise स्टैक पर स्विच करने के लिए सिग्नल, और सिग्नल हैंडलर को फ़ंक्शन कॉल करने के लिए डेटा पढ़ना है, और थ्रेड-स्थानीय डेटा से इसे पास करने का क्या तर्क है।

ध्यान दें कि यह दृष्टिकोण काफी महंगा है (ढेर को बदलने के लिए कई सिस्टम कॉल), लेकिन POSIX सिस्टम के लिए 100% पोर्टेबल होना चाहिए। चूंकि यह धीमा है, इसलिए आप असेंबली में लिखे गए आर्क-विशिष्ट कॉल-ऑन-ऑल्ट-स्टैक फ़ंक्शंस बनाना चाहते हैं, और केवल मेरे सामान्य समाधान का उपयोग आर्क के लिए फ़ॉलबैक के रूप में करते हैं जहां आपने असेंबली संस्करण नहीं लिखा है।

+0

यह एक दिलचस्प विचार है, लेकिन बहुत महंगा है क्योंकि यह सिस्टम कॉल का उपयोग करता है। वैसे भी जवाब के लिए धन्यवाद। –

+0

ठीक है अगर आप जिस सीपीयू की परवाह करते हैं, उसके लिए एएसएम लिखना चाहते हैं, तो यह एक सभ्य फॉलबैक प्रदान कर सकता है। आप पुराने फॉलबैक के रूप में पुराने 'मेकॉनटेक्स्ट' एपीआई (2008 में हटाए गए पॉज़िक्स 2001 में अश्लील) पर भी विचार कर सकते हैं क्योंकि यह पूरी तरह से उपयोगकर्ता स्पेस में किया जा सकता है। –

+0

आम तौर पर, अपने स्वयं के ढेर को स्थापित करना और संदर्भों को स्वैप करने के लिए कुछ असेंबली स्टब्स रखना काम करेगा। हालांकि, आप "स्टैक चेक" में भाग सकते हैं जो लागू करता है कि स्टैक पॉइंटर स्मृति की एक विशिष्ट सीमा के भीतर है। स्टैक पॉइंटर के साथ आपको स्टैक सीमा (जहां भी यह आपके प्लेटफॉर्म पर संग्रहीत है) को स्वैप करने की आवश्यकता है। उदाहरण के लिए, विंडोज़ में यह जीएस सेगमेंट में _TIB :: स्टैकलिमिट और _TIB :: स्टैकबेस में है। – doug65536