سؤال

وأنا على تشغيل أوبونتو 9.10 (الكرمية كوالا)، وأخذت نظرة على هيكل jmp_buf الذي هو مجرد مجموعة من 12 [إينتس]. عند استخدام setjmp، وتمر في jmp_buf هيكل 4 يتم حفظ أصل 12 إدخالات خارج. هذه الإدخالات 4 هي مؤشر المكدس، مؤشر الإطار، عداد البرنامج وعنوان المرسل. ما هي لأخرى 8 مداخل؟ هم يعتمدون على الجهاز؟ هو إدخال آخر قاعدة الجدول شريحة التسجيل؟ ماذا هناك حاجة لاستعادة البيئة موضوع / عملية بشكل صحيح؟ نظرت من خلال الصفحة رجل، ومصادر أخرى، ولكن لم أتمكن من العثور على رمز التجمع من أجل setjmp.

هل كانت مفيدة؟

المحلول

في ماك X 10.6.2، و<setjmp.h> رأس ينتهي باستخدام <i386/setjmp.h>، وهناك تقول:

#if defined(__x86_64__)
/*
 * _JBLEN is number of ints required to save the following:
 * rflags, rip, rbp, rsp, rbx, r12, r13, r14, r15... these are 8 bytes each
 * mxcsr, fp control word, sigmask... these are 4 bytes each
 * add 16 ints for future expansion needs...
 */
#define _JBLEN ((9 * 2) + 3 + 16)
typedef int jmp_buf[_JBLEN];
typedef int sigjmp_buf[_JBLEN + 1];

#else

/*
 * _JBLEN is number of ints required to save the following:
 * eax, ebx, ecx, edx, edi, esi, ebp, esp, ss, eflags, eip,
 * cs, de, es, fs, gs == 16 ints
 * onstack, mask = 2 ints
 */

#define _JBLEN (18)
typedef int jmp_buf[_JBLEN];
typedef int sigjmp_buf[_JBLEN + 1];

#endif

وأنت من المحتمل العثور على متطلبات مماثلة على لينكس - وjmp_buf يحتوي على معلومات كافية لتخزين حالة اللازمة. و، لاستخدامه، وكنت حقا لا تحتاج إلى معرفة ما يحتوي عليه. كل ما عليك القيام به هو الثقة بأن منفذي حصلت عليه صحيحة. إذا كنت ترغب في تغيير التنفيذ، ثم كنت بحاجة لفهم ذلك، بطبيعة الحال.

لاحظ أن setjmp longjmp وهي آلة جدا محددة. قراءة Plauger في " وC مكتبة ستاندرد " لمناقشة بعض القضايا المطروحة في تنفيذها. المزيد من رقائق الحديثة تجعل من الصعب تنفيذ بشكل جيد.

نصائح أخرى

وsetjmp / longjmp / sigsetjmp تعتمد إلى حد كبير على بنية وحدة المعالجة المركزية، ونظام التشغيل، وخيوط نموذج. وظائف الأولين الشهيرة (أو سيئ السمعة، اعتمادا على بوف الخاص بك) ظهرت في نواة يونكس الأصلية باعتبارها وسيلة "منظم" للاسترخاء من مكالمة نظام فاشل، ومن ط / خطأ س أو حالات سيئة أخرى.

وتصريحات هيكل في /usr/include/setjmp.h (لينكس فيدورا) يقول <م> دعوة البيئة، بالإضافة إلى ربما حفظها قناع الإشارة. ويشمل /usr/include/bits/setjmp.h ل أعلن jmp_buf لدينا مجموعة من ستة [إينتس] 32-بت، على ما يبدو محددة إلى الأسرة إلى x86.

وبينما لم أتمكن من العثور على مصدر آخر غير <وأ href = "http://www.filewatcher.com/p/linux-2.3.19.tar.bz2.13223427/linux/arch/ppc/xmon/ setjmp.c.html "يختلط =" noreferrer "> تنفيذ PPC أو التعليقات هناك يلمح معقول أن يجب حفظ الإعدادات FPU. هذا الأمر يبدو معقولا تماما منذ فشله في استعادة وضع التقريب، حجم المعامل الافتراضية، معالجة الاستثناء، وما إلى ذلك يكون مثيرا للدهشة.

وانها نموذجية من المهندسين نظام لحجز مساحة أكبر قليلا مما هو مطلوب فعلا في مثل هذا الهيكل. وهناك عدد قليل بايت إضافية هي بالكاد أي شيء إلى العرق، وخاصة بالنظر إلى ندرة الاستخدامات الفعلية للsetjmp / longjmp. وجود مساحة صغيرة جدا بالتأكيد يشكل خطرا. السبب الأبرز أستطيع أن أفكر في وجود خارج بدلا من كونها بقعة على غير أنه إذا تم تغيير إصدار مكتبة وقت التشغيل بحاجة إلى مساحة أكبر في jmp_buf، من خلال وجود غرفة إضافية محفوظة بالفعل، وليس هناك حاجة إلى إعادة ترجمة البرامج في اشارة الى ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top