2009-12-18 10 views
14

क्या i386 पर भी डेटा-संरेखण दोषों को पकड़ना संभव है? शायद i386 विशिष्ट मशीन रजिस्टर या ऐसा कुछ सेट करके।x86: डेटा-संरेखण दोषों को कैसे पकड़ें (स्पार्क पर उर्फ ​​सिगबस)

सोलारिस-स्पार्क पर मुझे इस मामले में एक सिगबस मिल रहा है, लेकिन i386 पर सब कुछ ठीक है।

पर्यावरण:

  • 32-बिट अनुप्रयोग
  • उबंटू कार्मिक
  • जीसीसी/जी ++ v4.4.1

संपादित: यहाँ क्यों है मैं इस पूछ रहा हूँ:

  • हमारे आवेदन सिगबस के साथ सोल-स्पार्क पर दुर्घटनाग्रस्त हो जाता है। डीबगिंग के प्रयोजन के लिए मैं अपने i386 प्लेटफ़ॉर्म पर समान व्यवहार करने का प्रयास करूंगा।
  • हमारी सोल-स्पार्क मशीन बहुत धीमी है, इसलिए संकलन और डिबगिंग में बहुत समय लगता है। और हमारी i386 मशीन अविश्वसनीय तेज़ है (8 कोर, 32 जी मेमोरी)।
  • i386 प्लेटफॉर्म पर भी डेटा-संरेखण दोषों पर प्रदर्शन की लागत है। और इसलिए मैं जहां भी संभव हो डेटा-संरेखण दोषों को ठीक करना चाहता हूं।
+0

ऐसा लगता है कि 'qemu' (जो SPARC को लक्षित कर सकता है) में आपके परीक्षण चलाने की तरह लगता है वास्तविक हार्डवेयर पर चलने से तेज़ हो सकता है? – ephemient

+0

मैंने कभी क्यूमु की कोशिश नहीं की है, लेकिन यह दिलचस्प लगता है। क्या यह बिना किसी प्रकार के "सिस्टम-रोम" या कुछ समान काम करता है? –

+1

क्यूईएमयू प्रोजेक्ट बंडल 'ओपनबीओस-स्पार्क्स', जो वास्तविक मशीन की तरह 'क्यूमु-सिस्टम-स्पार्क' देने के लिए पर्याप्त है। वहां 'क्यूमु-स्पार्क' भी है जो अनुकरण के तहत निष्पादन योग्य केवल एक लिनक्स चलाता है, मूल कर्नेल में सिस्कोल का अनुवाद करता है। – ephemient

उत्तर

3

वोकिला-ओलिबा के उत्तर पर विस्तार करने के लिए "SOF Mis-aligned pointers on x86." धागा को देखते हुए ऐसा लगता है कि जीसीसी गलत गठबंधन स्मृति पहुंच के साथ कोड उत्पन्न कर सकता है। AFAIK आप पर इसका कोई नियंत्रण नहीं है।

जीसीसी संकलित कोड पर संरेखण जांच सक्षम करना एक बुरा विचार होगा। आपको अच्छा सी कोड के लिए SIGBUS त्रुटियां प्राप्त करने का जोखिम है।

reedited: के बारे में है कि

+0

@alexandre: I * चाहता हूं * इन सिगबस त्रुटियों को प्राप्त करें। पाठ्यक्रम के उत्पादन कोड में नहीं, बल्कि केवल डीबगिंग के लिए। –

+3

आपको कोड के लिए सिगबस होने का जोखिम है जो SPARC__ पर __ कार्य करता है। ऐसा लगता है कि x86 gcc वैरिएबल प्रारंभिकरण जैसे स्थानों में गलत गठबंधन पहुंच करता है और मुझे यकीन नहीं है कि आप उस व्यवहार को बदल सकते हैं। –

+0

@alexandre: आप सही हैं!मेरा दूसरा जवाब दिखाता है कि i386 पर संरेखण विफलताओं की जांच कैसे करें। लेकिन यह कोड स्पार्क पर पूरी तरह से अच्छी तरह से काम करता है। I386 पर यह सिगबस प्राप्त करता है। I386 के लिए जीसीसी व्यवहार को उदाहरण के द्वारा बदला जा सकता है विशेषता __ ((गठबंधन (आकार (char *)))। लेकिन वैश्विक जीसीसी ध्वज स्थापित करके वैश्विक स्तर पर ऐसा करना संभव नहीं है। डेटा आइटम पर केवल व्यक्तिगत रूप से __attribute सेटिंग्स संभव है। और जिस परियोजना पर मैं काम कर रहा हूं, उसके लिए यह बहुत अधिक प्रयास है :-( –

0

इंटेल शुरुआत से अनचाहे स्थानान्तरण में बनाया गया - यह x86 ब्रांड नया था जब यह विक्रय बिंदुओं में से एक था। मैं अनचाहे पहुंच को फँसाने के लिए अपने कारणों को समझता हूं, लेकिन मुझे नहीं लगता कि यह संभव है।

संपादित करें: गलत साबित होने के लिए बहुत खुश हैं।

+0

आप जहां पूरी तरह से गलत नहीं है। यद्यपि सिगबस को i386 पर भी मजबूर किया जा सकता है, लेकिन इससे बहुत मदद नहीं मिलती है। ऐसा इसलिए है क्योंकि एसपीएआरसी पर "स्टैक मिस-संरेखण" को हानिकारक नहीं माना जाता है और सिगबस का कारण नहीं बनता है। लेकिन i386 पर एसी ध्वज सेट होने पर यह हानिकारक "स्टैक गलत-संरेखण" के लिए भी सिबगस का कारण बनता है। –

7

इस बीच मुझे इस विषय को संबोधित करने वाला इंटेल सीपीयू दस्तावेज़ मिला।

Intel® 64 and IA-32 Architectures Software Developer’s Manual देखें।

यह सब सामान एक साथ रखना मुश्किल लगता है। हालांकि ऐसा लगता है कि यह पूरी तरह असंभव नहीं है। दिलचस्प अध्याय 4.10.5 संरेखण

संपादित (उल्लेख दस्तावेज़ से कुछ गाढ़ा सामग्री) जांच की जा रही है:

पेज 5-60

Interrupt 17 Alignment Check Exception (#AC) 

to enable alignment checking, the following conditions must be true: 

AM flag is set(bit 18 of control regisster CR0) 
AC flag is set (bit 18 of the EFLAGS) 
The CPL is 3 (protected mode or virtual-8086 mode). 

अतिरिक्त - 14.8.2.6 में - मेमोरी कंट्रोलर त्रुटियां का उल्लेख किया गया है। मुझे नहीं पता कि यह केवल दूसरे शब्दों में ही है:

table 14-11, Encoding of MMM and CCCC Sub-Fields 
Address/Command Error AC 011 
+0

दुर्भाग्यवश, उपयोगकर्ता-मोड कोड सभी रिंग 3 में चलता है; उपरोक्त अपवाद उत्पन्न नहीं करेगा। – ephemient

+0

मुझे इन CPU "छल्ले" के बारे में ज्ञान की कमी है। लेकिन यदि एक सामान्य प्रोग्राम रिंग -3 का उपयोग करता है तो यह काफी अच्छा होगा। –

+0

क्षमा करें, मैं पहले गलत पढ़ता हूं; "प्रोसेसर विशेषाधिकार स्तर 0, 1, या 2 पर परिचालन करते समय संरेखण अपवाद उत्पन्न नहीं करता है" निश्चित रूप से स्पष्ट रूप से रिंग 3 छोड़ देता है। – ephemient

3

मुझे एसओएफ पर एक बहुत ही सरल समाधान मिला है! देखें: Mis-aligned pointers on x86

int main(int argc, char **argv) 
{ 
# if defined i386 
    /* EDIT: enable AC check */ 
    asm("pushf; " 
    "orl $(1<<18), (%esp); " 
    "popf;"); 
# endif 

    char d[] = "12345678"; /* yep! - causes SIGBUS even on Linux-i386 */ 
    return 0; 
} 

लेकिन मैं कबूल करना चाहिए कि मुझे समझ नहीं आता क्यों काम

चार घ [] = "12345678";

गलत गठबंधन माना जाता है?

संपादित करें:

स्पार्क मशीन पर

[] करने के लिए चार घ असाइनमेंट की लाइन पर कोई SIGBUS है।

2

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

0

कई साल बाद: यदि आपके जीसीसी/बजना काफी नया है (जीसीसी 4.9, 3.3 बजना?) आप प्रक्षालक (-fsanitize=undefined) अपरिभाषित व्यवहार के बारे में गलत संरेखित किसी दिए गए मंच पर पहुँचता चेतावनी प्राप्त करने के लिए के साथ अपने कोड का निर्माण करने में सक्षम हो सकता (लेकिन विभिन्न प्लेटफार्मों को ध्यान में रखते हुए अलग-अलग संरेखण की आवश्यकता होती है, विभिन्न कंपाइलर्स अलग-अलग लेआउट आदि चुनेंगे)। विवरण के लिए https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html और https://developers.redhat.com/blog/2014/10/16/gcc-undefined-behavior-sanitizer-ubsan/ देखें।

संबंधित मुद्दे