मैं उबंटू 9.10 (कर्मिक कोआला) चला रहा हूं, और मैंने jmp_buf
संरचना को देख लिया जो सिर्फ 12 ints की एक सरणी है जब मैं setjmp
का उपयोग करता हूं, और एक jmp_buf
संरचना में & mdash; 12 प्रविष्टियों में से 4 को सहेजा जाता है I ये 4 प्रविष्टियां स्टैक पॉइंटर, फ़्रेम पॉइंटर, प्रोग्राम काउंटर और रिटर्न पता हैं। अन्य 8 प्रविष्टियाँ क्या हैं? क्या वे मशीन-निर्भर हैं? क्या एक और प्रविष्टि खंड तालिका आधार रजिस्टर है? किसी थ्रेड / प्रक्रिया के वातावरण को ठीक से बहाल करने के लिए और क्या जरूरत है? मैंने मैन पेज, अन्य स्रोतों के माध्यम से देखा, लेकिन मुझे setjmp
के लिए विधानसभा कोड नहीं मिल सका।
मैकोड एक्स 10.6.2 पर, हैडर & lt; setjmp.h & gt;
को & lt; i386 / setjmp.h & gt;
का उपयोग करके समाप्त होता है, और इसमें कहा गया है:
#if परिभाषित (__ x86_64__) / * * _JBLEN निम्न सहेजने के लिए जरूरी संख्या की संख्या है: * rflags, rip, rbp, rsp, rbx, r12, r13, R14, r15 ... ये 8 बाइट्स प्रत्येक * mxcsr, fp नियंत्रण शब्द, सिग्मास्क हैं ... ये 4 बाइट्स प्रत्येक हैं * भविष्य के विस्तार की जरूरतों के लिए 16 ints जोड़ें * * / #define _JBLEN ((9 * 2) + 3 + 16) टाइपिंगफेस इंट jmp_buf [_JBLEN]; टाइपिंगफ इफ sigjmp_buf [_JBLEN + 1]; #ELSE / * * _JBLEN निम्न सहेजने के लिए जरूरी संख्या की संख्या है: eax, ebx, ecx, edx, edi, esi, ebp, esp, ss, eflags, eip, * cs, de, es, fs, gs = = 16 ints * onstack, मास्क = 2 ints * / #define _JBLEN (18) typedef int jmp_buf [_JBLEN]; टाइपिंगफ इफ sigjmp_buf [_JBLEN + 1]; #endif
आपको शायद लिनक्स पर ऐसी ही ज़रूरतें मिलेंगी- jmp_buf
में जरूरी स्टेट को स्टोर करने के लिए पर्याप्त जानकारी है। और, इसका इस्तेमाल करने के लिए, आपको वास्तव में यह जानने की ज़रूरत नहीं है कि इसमें क्या है; आपको बस इतना करना है कि कार्यान्वयनकर्ताओं को यह सही मिला है। यदि आप कार्यान्वयन को बदलना चाहते हैं, तो आपको इसके बारे में समझने की जरूरत है।
ध्यान दें कि setjmp और longjmp बहुत मशीन विशिष्ट हैं उन्हें लागू करने में शामिल कुछ मुद्दों की चर्चा के लिए प्लागर का "" पढ़ें अधिक आधुनिक चिप्स वास्तव में अच्छी तरह से लागू करने के लिए कठिन बनाते हैं।
No comments:
Post a Comment