
TI AM3358 बूट ROM का रिवर्स इंजीनियरिंग
मुझे पहली बार कुछ Beaglebone Black बोर्ड हाथ लगे हुए शायद अठारह महीने हो गए हैं, जो कूड़ेदान से बचाए गए थे। दुर्भाग्यवश, बोर्ड तुरंत काम नहीं करे। अब, यह मेरा इन बोर्डों में से किसी एक के साथ, या उस मामले के लिए किसी भी सिंगल बोर्ड कंप्यूटर के साथ पहली बार काम करना था, इसलिए मुझे यकीन नहीं था कि समस्या कुछ ऐसी थी जो मैं कर रहा था, या बोर्डों में ही कुछ गड़बड़ थी (शायद यही वजह है कि वे पहली जगह कूड़ेदान के लिए जा रहे थे)। इन बोर्डों को वास्तव में बूट कराना शुरू करने में मुझे काफी लंबा समय और बहुत अधिक प्रयास लगा, लेकिन लानत है, मैंने कर दिखाया। और रास्ते में मैंने यही सीखा।
मैंने इस repo में कुछ उपयोगिताएँ शामिल की हैं, साथ ही Ghidra से निर्यात की गई एक xml फ़ाइल भी है जिसमें वे सभी प्रतीक (symbols) हैं जो मैंने अब तक रिवर्सिंग से प्राप्त किए हैं। मैंने किसी भी कॉपीराइट मुद्दे से बचने के लिए, केवल मामले में, वास्तविक फर्मवेयर के बिना निर्यात करने के लिए इस पोस्ट का उपयोग किया। यदि आप स्वयं बूट ROM को डीबग करना चाहते हैं, तो आपके पास पहले से ही JTAG जुड़ा होगा, इसलिए आप स्वयं बूट ROM (0x20000 से 0x2BFFF तक) डंप कर सकते हैं।
प्रतीकों को लोड करने के लिए:
0x20000 पर सेट करते हैं और आप ब्लॉक का नाम bootrom सेट कर सकते हैं।main() पर, या MMC/SD कार्ड बूट हैंडलर पर कूद सकते हैं।शुरुआत करने के लिए, मुझे पता था कि ये मानक beaglebone black के कस्टम संस्करण थे, इसलिए शुरुआत में मैंने निर्धारित किया कि यह बोर्ड पर ही कुछ गायब हो सकता है, जैसे बोर्ड पहचानकर्ता। जब मैंने balenaEtcher के साथ फॉर्मेट किए गए एक मानक SD कार्ड को बूट किया, तो मुझे कुछ भी नहीं दिखा। मुझे उम्मीद थी कि बोर्ड पर LEDs चमकने लगेंगी, और मुझे उम्मीद थी कि UART से USB केबल जोड़ने से मुझे U-Boot प्रक्रिया देखने को मिलेगी। हालाँकि, UART शांत था। यदि मैं SD कार्ड हटा देता, तो यह बार-बार अक्षर C आउटपुट करता, जो UART/serial बूट के लिए अपेक्षित व्यवहार है। यह निश्चित रूप से बूट करने की कोशिश कर रहा था, और SD कार्ड इस व्यवहार को बदल रहा था, लेकिन मेरे पास इससे अधिक कोई दृश्यता नहीं थी। वेब पर अधिकांश समस्या निवारण U-Boot आउटपुट को समस्याओं के निदान के लिए शुरुआती बिंदु के रूप में लेता था। मुझे लगता है कि मुझे वह विलासिता नहीं मिलने वाली थी।
इस बिंदु पर मैंने सोचा कि एक डीबग प्रोब कनेक्ट करना उचित होगा। दुर्भाग्य से, मौजूदा फुटप्रिंट के लिए मेरे पास मेल खाता हेडर नहीं था, इसलिए मैंने अपना खुद का बना लिया।
beaglebone बोर्ड में P2 पदनाम वाला एक हेडर है जो JTAG कनेक्शन को बाहर निकालता है। मैंने इस पर कुछ तारों को एक फीमेल हेडर से जोड़ा ताकि मैं अपने J-Link के माध्यम से उससे बात कर सकूँ।



Ozone (Segger डीबगर) में लॉन्च करते हुए मैंने J-Link कॉन्फ़िगर किया और केवल एंट्री पॉइंट खोजने की कोशिश करके शुरू किया। मैंने सोचा था कि रीसेट-हॉल्ट मुझे वहाँ पहुँचा देगा जहाँ मुझे होना चाहिए, और इसी तरह मैं इस (गलत) धारणा पर पहुँचा कि एंट्री पॉइंट 0x2148a है, हालाँकि मैंने निश्चित रूप से देखा कि यह सुसंगत नहीं था। बाद में, मुझे एहसास हुआ कि AM335x बोर्ड J-Link के रीसेट-हॉल्ट के साथ अच्छी तरह से काम नहीं करते हैं, इसलिए वास्तव में कुछ सौ क्लॉक साइकिलों की देरी होती थी, जो मुझे अनिश्चित रूप से किसी बूट हैंडलर के अंदर पहुँचा देती थी। (मैंने आखिरकार TI के Code Composer Studio के लिए एक GEL फ़ाइल लिखकर इसे हल किया, जो J-Link डीबगिंग का समर्थन करता है - रीसेट पर, PC रजिस्टर रीसेट हैंडलर पर सेट होता है, रजिस्टर साफ़ हो जाते हैं, और इंस्ट्रक्शन मोड को ARM पर बाध्य किया जाता है।)
TI फ़ोरम पर एक थ्रेड (AM335x: TI employees, where can I get the ROM Bootloader source code/symbols?) से मुझे कुछ डीबगिंग प्रतीक मिले: SPI Initialize at 0x231e0, SPI ReadSectors at 0x23230, और 0x24bfa एक रूटीन है जो UART रीड करता है। मुझे लगता है कि यह थोड़ी मदद है। मैंने देखा कि बूट 0x402f0440 पर एक अनंत लूप में समाप्त होकर विफल हो गया, जो एक डेड लूप है। हम्म, बाकी बूट ROM से काफी दूर, शायद RAM या किसी चीज़ में होना चाहिए। शायद अब तकनीकी संदर्भ मैनुअल (TRM) पर जाने का समय है!
TRM का अध्याय 26 बूटिंग पर बहुत सारी जानकारी रखता है। हमें बूट ROM का निम्नलिखित दृश्य मिलता है:

विवरण:
सार्वजनिक ROM कोड की वास्तुकला चित्र 26-1 में दिखाई गई है। इसे शीर्ष-डाउन दृष्टिकोण के साथ तीन मुख्य परतों में विभाजित किया गया है: उच्च-स्तरीय, ड्राइवर, और हार्डवेयर अमूर्त परत (HAL)। एक परत एकीकृत इंटरफ़ेस के माध्यम से निचले स्तर की परत के साथ संचार करती है। उच्च स्तरीय परत सार्वजनिक ROM कोड के मुख्य कार्यों के लिए जिम्मेदार है: वॉचडॉग और क्लॉक कॉन्फ़िगरेशन और मुख्य बूटिंग रूटीन। ड्राइवर परत किसी भी बूटिंग डिवाइस के लिए इंटरफ़ेस विनिर्देश के अनुसार तार्किक और संचार प्रोटोकॉल लागू करती है। अंत में HAL हार्डवेयर इन्फ्रास्ट्रक्चर IPs के साथ बातचीत करने के लिए निम्नतम स्तर के कोड को लागू करता है। बूटिंग डिवाइस डिवाइस IO पैड से जुड़े होते हैं।

चित्र 26-2 सार्वजनिक ROM कोड बूटिंग प्रक्रिया के लिए उच्च स्तरीय प्रवाह को दर्शाता है। इस डिवाइस पर सार्वजनिक ROM कोड सुरक्षित स्टार्टअप (Secure ROM कोड द्वारा निष्पादित) के पूरा होने पर शुरू होता है। ROM कोड फिर सार्वजनिक स्टार्ट-अप प्रक्रिया के भाग के रूप में प्लेटफ़ॉर्म कॉन्फ़िगरेशन और प्रारंभिकरण करता है। बूटिंग डिवाइस सूची SYSBOOT पिन के आधार पर बनाई जाती है। एक बूटिंग डिवाइस एक मेमोरी बूटिंग डिवाइस हो सकता है (सोल्डरेड फ्लैश मेमोरी या अस्थायी रूप से बूटिंग डिवाइस जैसे मेमोरी कार्ड) या किसी होस्ट से जुड़ा एक परिधीय इंटरफ़ेस। बूटिंग प्रक्रिया का मुख्य लूप बूटिंग डिवाइस सूची से गुजरता है और वर्तमान में चयनित बूटिंग डिवाइस से एक छवि खोजने की कोशिश करता है। यह लूप तब बाहर निकलता है जब एक मान्य बूटिंग छवि मिलती है और सफलतापूर्वक निष्पादित होती है या वॉचडॉग समाप्ति पर। छवि प्रमाणीकरण प्रक्रिया HS डिवाइस पर छवि निष्पादन से पहले की जाती है। प्रमाणीकरण प्रक्रिया में विफलता सुरक्षित ROM में एक "डेड लूप" (वॉचडॉग रीसेट की प्रतीक्षा) में शाखा करने की ओर ले जाती है।
मेमोरी मैप! अपवाद वेक्टर! फ्लो-चार्ट! इस अनुभाग में बहुत सारी जानकारी है। मेरा काम बहुत आसान हो गया।
इस बिंदु पर मैंने JTAG प्रोब का उपयोग फर्मवेयर को कुछ अलग फ़ाइलों में डाउनलोड करने के लिए किया, और Ghidra में चीज़ें लोड करना शुरू कर दिया। ऐसा लगता था कि कोई SVD फ़ाइलें या अन्य रजिस्टर मैपिंग सुविधाजनक प्रारूप में उपलब्ध नहीं थीं, जो वास्तव में दुर्भाग्यपूर्ण है, क्योंकि इसका मतलब है कि मुझे मेमोरी क्षेत्रों और रजिस्टरों और सब कुछ मैन्युअल रूप से परिभाषित करने की आवश्यकता है। यह एक थकाऊ प्रक्रिया थी, लेकिन थोड़ी देर बाद मेरे पास एक पायथन स्क्रिप्ट थी जिसका उपयोग मैं AM3358 के लिए Ghidra में प्रतीकों को लोड करने के लिए कर सकता था। चिंता करने के लिए एक कम चीज़!
ऐसा लगता है कि मेरे पास जो फ़ाइलें हैं उन्हें इस प्रकार मैप किया जा सकता है: