2012-03-05 23 views
5

मैं एक लिनक्स कर्नेल zImage को डीकंप्रेस करने से पहले डीडीबी का उपयोग करने की कोशिश कर रहा हूं। कर्नेल एआरएम लक्ष्य पर चल रहा है और मेरे पास एक जीडीबी सर्वर स्टब के साथ एक जेएबी डीबगर जुड़ा हुआ है। लक्ष्य को बूट लोडर लोड करना है। बूट लोडर कर्नेल छवि को फ्लैश से पढ़ता है और इसे 0x20008000 पर रैम में रखता है, फिर उस स्थान पर शाखाएं।डीबग लिनक्स कर्नेल प्री-डिकंप्रेशन चरण

मैं GDB शुरू कर दिया और दूरदराज के लक्ष्य से कनेक्ट किया है, तो मैं तो जैसे GDB के add-symbol-file आदेश का उपयोग करें:

add-symbol-file arch/arm/boot/compressed/vmlinux 0x20008000 -readnow 

जब मैं उस पते के लिए एक ब्रेकपाइंट सेट, यह सही जगह पर जाल है - सही जब यह कर्नेल के लिए शाखाओं। हालांकि, जीडीबी arch/arm/boot/compressed/head.S के स्रोत से गलत रेखा दिखाता है। यह पीछे 4 लाइनें है। मैं इसे कैसे ठीक करूं?

मैं भी -s .start 0x20008000 साथ add-symbol-file करने के लिए -s section addr विकल्प जोड़ने की कोशिश की है; यह वास्तव में एक ही समस्या में परिणाम।

+0

पहले सुनिश्चित करें कि आपके पास एक gcc और gdb है जो संगत हैं, अधिमानतः उसी टूलचेन संस्करण से। साथ ही, पता है कि लिनक्स कर्नेल को -O2 के साथ संकलित किया गया है, इसलिए कुछ पंक्तियां अनुकूलित हो जाती हैं। क्या आप वाकई कहीं भी .align कीवर्ड नहीं हैं? –

+0

डिकंप्रेसर कोड सभी पीसी रिश्तेदार है। यह खुद को एक क्षेत्र से दूसरे क्षेत्र में भी कॉपी कर सकता है। बूट लोडर इसे डाल सकता है जहां डिकंप्रेस्ड लक्ष्य है; इसलिए इसे खुद को स्थानांतरित करना है। मुझे संदेह है कि आप निश्चित प्रतीकों के साथ JTAG का उपयोग करके अच्छे समय प्राप्त करने जा रहे हैं। मुझे नहीं पता कि क्या आप किसी भी तरह जीडीबी के साथ * स्थानांतरित कर सकते हैं। –

उत्तर

2

असेंबलर मैक्रोज़ हैं जो कम स्तर डीबग के साथ संकलित करते समय सामान प्रिंट करते हैं। आपको यह सुनिश्चित करना होगा कि मैक्रोज़ आपके बोर्ड के लिए उपयुक्त हैं।

linux-latest/arch/arm$ find . -name debug-macro.S | wc 
56  56 2306 

अपने बोर्ड के लिए फ़ाइल ढूंढें और सुनिश्चित करें कि सही सीरियल पोर्ट रजिस्ट्रार हिट हैं। आप JTAG का उपयोग करके कोड को बाहर कर सकते हैं। इन मैक्रोज़ का उपयोग डिकंप्रेस कोड में किया जाता है। बेशक * CONFIG_DEBUG_LL * के साथ कॉन्फ़िगर करें।

अधिकतर एएजी सही नहीं हैं या अन्य आवश्यकताओं में से एक हैं। चेकआउट दस्तावेज़ीकरण/हाथ/बूटिंग यह सुनिश्चित करने के लिए कि आपके पास रजिस्ट्रार ठीक से सेट हैं। ध्यान दें कि हालिया कर्नेल के साथ डीटी सूची भेजने के लिए एक नई आवश्यकता है।

+0

वर्तमान मैक्रोज़ [बांह में डीबग शामिल हैं] (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/include/debug) (जनवरी2015 v3 के अनुसार) .19)। यह भी देखें: [संपीड़ित डीबग।] (Https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/boot/compressed/debug.S) –