2014-11-17 8 views
5

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

ori r20, r0, 0 
ori r12, r0, 0x1000000 
/* next line should break it */ 
sw r20, r12, r0 

(Ie, लिखना: -

के रूप में मैं जाना मैं एक तुच्छ स्थान (0x1000000) संदर्भ के लिए विधानसभा का यह छोटा टुकड़ा लिखा था मैं सीख रहा हूँ के रूप में मैं पर वी एम के साथ इस रूप में विशेषाधिकार प्राप्त कोड चला रहा हूँ r20 == 0 पते के लिए बाहर की सामग्री r12 == 0x1000000 और r0 == 0 => 0x1000000 oring जाहिर द्वारा गठित)

लेकिन अपवाद वेक्टर के लिए कूद करने के बजाय, GDB रिपोर्ट "कार्यक्रम SIGSEV प्राप्त।" - मैं गलत क्या मिला? मुझे एमएसआर में सक्षम हार्डवेयर अपवादों को थोड़ा सा नहीं मिला है लेकिन मैनुअल का कहना है कि आप इन अपवादों को किसी भी मामले में मास्क नहीं कर सकते हैं, इसलिए यह मुद्दा नहीं होना चाहिए।

अधिक जानकारी मैं नहीं किसी भी अपवाद हैंडलिंग कोड के (जैसे, मिसलिग्न्मेंट अपवाद सहित) निष्पादित करने के लिए, या नहीं, मैं डिबगर का उपयोग कर रहा प्राप्त कर सकते हैं (जब तक मैं स्पष्ट रूप से इसे कहते हैं)। डिबगर बंद के साथ मैं (मैं केवल परीक्षण पता बदल एनबी - वहाँ ऊपर 0xA000000 और 0x100000 के बीच अंतर में कोई महत्व नहीं है) OVPsim से उत्पादन मिलता है:

Processor Exception (PC_PRX) Processor 'platform/cpu0' 0x248: sw  r20, r12, r0 
Processor Exception (PC_WPX) No write access at 0xa000000 

यह सब कोड विशेषाधिकार प्राप्त मोड में चलाया जा रहा है, तो मैं इसके लिए कोई अति कारण नहीं देख सकता हूं कि हैंडलर को कॉल न करें, जब तक मैंने माइक्रोब्लैज को ठीक से कॉन्फ़िगर नहीं किया है। मैं इन चालू कर दी है:

icmAddStringAttr(cpu1_attr, "endian", "big"); 
icmAddDoubleAttr(cpu1_attr, "mips", 100.000000); 
icmAddStringAttr(cpu1_attr, "variant", "V8_20"); 
icmAddBoolAttr(cpu1_attr, "verbose", "true"); 
icmAddUns32Attr(cpu1_attr, "C_PVR", 2); 
icmAddUns32Attr(cpu1_attr, "C_USE_MMU", 3); 
icmAddStringAttr(cpu1_attr, "C_USE_BARREL", "1"); 
icmAddStringAttr(cpu1_attr, "C_USE_DIV", "1"); 
icmAddUns32Attr(cpu1_attr, "C_USE_INTERRUPT", 1); 
icmAddUns32Attr(cpu1_attr, "C_MMU_TLB_ACCESS", 3); 
icmAddUns32Attr(cpu1_attr, "C_UNALIGNED_EXCEPTIONS", 1); 
icmAddUns32Attr(cpu1_attr, "C_ILL_OPCODE_EXCEPTION", 1); 
icmAddUns32Attr(cpu1_attr, "C_DIV_ZERO_EXCEPTION", 1); 
icmAddUns32Attr(cpu1_attr, "C_OPCODE_0x0_ILLEGAL", 1); 
icmAddUns32Attr(cpu1_attr, "C_DEBUG_ENABLED", 1); 

वहाँ विश्वास करने के लिए के रूप में OVPsim Microblaze पर लिनक्स चलेगा यह काम नहीं करेगा कोई कारण नहीं है।

+0

आप माइक्रोब्लॉज़ कॉन्फ़िगरेशन ठीक दिखता है। एम्यूलेटर का उत्पादन थोड़ा अजीब दिखता है। "नो राइट एक्सेस" अपवाद का अर्थ यह हो सकता है कि संबंधित पृष्ठ टीएलबी में पाया गया था लेकिन इसमें कोई लेखन पहुंच सक्षम नहीं है। आपको इस मामले में भी अपवाद देखना चाहिए। 'एमएसआर' में' ईई' बिट सेट करने का प्रयास करें, हालांकि, अगर उसके ओवीपीसिम कार्यान्वयन गलत है। – dkz

+0

मेरे पास पहले से ही ईई ​​बिट सेट है :( एमएसआर 0x2502 – adrianmcmenamin

+0

माइक्रोबलाज़ पैरामीटर 'C_MMU_ZONES = 2' सेट करने के लिए बस एक और सुझाव है। भले ही आप सुरक्षा क्षेत्र का उपयोग नहीं कर रहे हों, जब यह पैरामीटर 0 माइक्रोब्लेज़ कोड उत्पन्न नहीं करता है या डेटा एक्सेस अपवाद। – dkz

उत्तर

1

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

हालांकि, अगर ICM_ATTR_SIMEX सिमुलेशन के लिए परिभाषित किया गया है तो सिमुलेशन अपवाद हैंडलर को वास्तविक प्रोसेसर के तरीके से निष्पादित करेगा - इसलिए मेरे उदाहरण के गुणों में ICM_ATTR_SIMEX जोड़ना - उदाहरण के लिए, नीचे दिखाए गए अनुसार इसे ऑरिंग करके, सब कुछ डालता है अपने सही स्थान पर:

#define SIM_ATTRS (ICM_ATTR_DEFAULT|ICM_ATTR_SIMEX) 
2

आपका टीएलबी अपवाद उत्पन्न होता है, यह जीडीबी है जो आपको हैंडलर में आने से रोकता है।

वीएम मोड डीबग करना एक मुश्किल बात है। मैं OVPsim और कितनी अच्छी तरह यह GDB के साथ एकीकृत है के परिचित नहीं हूँ, लेकिन वहां यह माध्यम से अपने तरीके से काम करने के कई तरीके हैं:

  1. स्पष्ट सॉफ्टवेयर ब्रेकपाइंट। बस brk r16, 0x18 निर्देश का उपयोग करें जहां आप कोड में ब्रेकपॉइंट सेट करना चाहते हैं और GDB को continue कमांड के साथ जाने दें। यह ब्रेक निष्पादित करने के बाद बंद हो जाएगा, इससे कोई फर्क नहीं पड़ता कि इसका वीएम उपयोगकर्ता कोड, या अपवाद हैंडलर।

    इसका नकारात्मक पक्ष, इस तरह के ब्रेक तक पहुंचने के बाद, जीडीबी से जारी रखने का कोई आसान तरीका नहीं है। आपको अगले निर्देश पते पर r16 या तो संशोधित करना होगा, या brk निर्देश को nop से जीडीबी से प्रतिस्थापित करना होगा।

  2. हार्डवेयर ब्रेकपॉइंट। यह सबसे आसान ब्रेक है जिसका उपयोग आप टीएलबी पृष्ठ उपस्थिति के बारे में चिंता किए बिना अपवाद पक्ष और वीएम-साइड कोड दोनों को डीबग करने के लिए कर सकते हैं। लेकिन हार्डवेयर ब्रेकपॉइंट्स को माइक्रोब्लैज से हार्डवेयर समर्थन की आवश्यकता होती है (सुनिश्चित नहीं है कि ओएसपीएसआईएम उनका समर्थन करता है)। जीडीबी में इसका उपयोग करने के लिए break कमांड के बजाय hbreak (या hb) का उपयोग करें।

  3. जीडीबी सॉफ्ट ब्रेकपॉइंट्स।यदि आप जानते हैं कि वे कैसे काम करते हैं और आपका वीएम-मॉडल काफी सरल है, तो भी आप नियमित शैली जीडीबी ब्रेकपॉइंट्स का उपयोग करने में सक्षम हो सकते हैं। असल में जीडीबी को उस कोड पेज पर पहुंच की आवश्यकता होती है जहां आप तोड़ना चाहते हैं (brk निर्देश लिखने के लिए)। तो वीएम मोड में आपको यह सुनिश्चित करना होगा कि पृष्ठ टीएलबी में मौजूद है और इसमें लेखन पहुंच है।

    गैर-वीएम मोड से ब्रेक सेट करने के लिए यह भी मुश्किल है जब आपका वर्चुअल पता भौतिक से भिन्न होता है। आपको यह सुनिश्चित करना होगा कि जिस पृष्ठ को आप अपना ब्रेकपॉइंट रखना चाहते हैं उसे भौतिक मेमोरी में लोड किया गया है और वर्चुअल एड्रेस को मैन्युअल रूप से भौतिक और सेट ब्रेकपॉइंट में अनुवादित करना है। तो जब तक आपके पास 1: 1 मैपिंग नहीं है (और सभी कोड और डेटा मेमोरी के अंदर है) या आपने अपना खुद का GDB stub लिखा है, यह जीडीबी ब्रेकपॉइंट्स का उपयोग करने के लिए एक पेंट है।

दुर्भाग्यवश, जीडीबी में कोड के माध्यम से कदम उठाना लगभग हर समय जीडीबी सॉफ्ट-ब्रेकपॉइंट्स का उपयोग करना है। अर्थात। आप गैर-वीएम कोड के अंदर ठीक से कदम उठा रहे हैं, या एकल लोड किए गए वीएम-पेज के अंदर लेखन अनुमतियां हैं। लेकिन एक बार जब आपको टीएलबी के बाहर कुछ करने या गैर-वीएम से वीएम कोड तक पहुंचने की आवश्यकता हो, तो यह वास्तव में निराशाजनक हो सकता है।

+0

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

+0

आपको पूरी तरह से डीबगर जाने दें, आपको इसे और अधिक ध्यान से उपयोग करने की आवश्यकता है। जीडीबी या तो वीएम या गैर-वीएम को सादे कोड डीबग करने पर ठीक है, लेकिन यदि आप टीएलबी अपवाद के माध्यम से कदम उठाने की कोशिश कर रहे हैं, तो जीडीबी बन जाता है स्मार्ट या बहुत अप्रत्याशित करने के लिए। एक और विचार खुद एमुलेटर है। जैसे क्यूईएमयू एमएमयू कार्यान्वयन पूर्ण नहीं था और लिनक्स कर्नेल को होस्ट करने के लिए पर्याप्त था। मैं डीबग मॉड्यूल के साथ वास्तविक माइक्रोब्लैज डिज़ाइन चलाने और Xilinx 'XMD टूल के साथ डीबग करने का सुझाव दूंगा, जो सादा, सरल और अनुमानित है। – dkz

+0

मुझे विश्वास है कि मुझे टीएलबी अपवाद, या वास्तव में कोई अपवाद मिल रहा है, क्योंकि डीबगर यहां मुद्दा नहीं है। मुझे लगता है कि यह एक सेटअप मुद्दा है - यानी जब मैं चीज को कॉन्फ़िगर या बूट कर रहा हूं तो मैंने किसी प्रकार की सेटिंग को याद किया है। – adrianmcmenamin

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