2010-12-07 41 views
7

मैं समझने की कोशिश कर रहा हूं कि पावरपीसी mpc8313 प्रोसेसर आधारित बोर्ड पर यूबूट का पोर्टिंग कैसे किया जाता है। इस प्रक्रिया के दौरान मैं uboot.lds, लिंकर स्क्रिप्ट फ़ाइल नामक फ़ाइल में आया था।uboot.lds को समझना

मुझे इस फ़ाइल को समझने की आवश्यकता है। मेरा मतलब है कि उल्लिखित सामग्रियों का महत्व और जहां वास्तविक पते यूबूट पैकेज में परिभाषित किए गए हैं। उदाहरण के लिए

;

/* Read-only sections, merged into text segment: */ 
. = + SIZEOF_HEADERS; 
.interp : { *(.interp) } 
.hash   : { *(.hash) } 
.dynsym  : { *(.dynsym) } 
.dynstr  : { *(.dynstr) } 
.rel.text  : { *(.rel.text) } 
.rela.text  : { *(.rela.text) } 
.rel.data  : { *(.rel.data) } 
.rela.data  : { *(.rela.data) } 
.rel.rodata : { *(.rel.rodata) } 
.rela.rodata : { *(.rela.rodata) } 
.rel.got  : { *(.rel.got) } 
.rela.got  : { *(.rela.got) } 
.rel.ctors  : { *(.rel.ctors) } 
.rela.ctors : { *(.rela.ctors) } 
.rel.dtors  : { *(.rel.dtors) } 
.rela.dtors : { *(.rela.dtors) } 
.rel.bss  : { *(.rel.bss) } 
.rela.bss  : { *(.rela.bss) } 
.rel.plt  : { *(.rel.plt) } 
.rela.plt  : { *(.rela.plt) } 
.init   : { *(.init) } 
.plt : { *(.plt) } 
.text  : 
{ 
    cpu/mpc83xx/start.o (.text) 
    *(.text) 
    *(.fixup) 
    *(.got1) 
    . = ALIGN(16); 
    *(.rodata) 
    *(.rodata1) 
    *(.rodata.str1.4) 
    *(.eh_frame) 
} 
.fini  : { *(.fini) } =0 
.ctors  : { *(.ctors) } 
.dtors  : { *(.dtors) } 

/* Read-write section, merged into data segment: */ 
. = (. + 0x0FFF) & 0xFFFFF000; 
_erotext = .; 
PROVIDE (erotext = .); 
.reloc : 
{ 
    *(.got) 
    _GOT2_TABLE_ = .; 
    *(.got2) 
    _FIXUP_TABLE_ = .; 
    *(.fixup) 
} 
__got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; 
__fixup_entries = (. - _FIXUP_TABLE_) >> 2; 

.data : 
{ 
    *(.data) 
    *(.data1) 
    *(.sdata) 
    *(.sdata2) 
    *(.dynamic) 
    CONSTRUCTORS 
} 
_edata = .; 
PROVIDE (edata = .); 

. = .; 
__u_boot_cmd_start = .; 
.u_boot_cmd : { *(.u_boot_cmd) } 
__u_boot_cmd_end = .; 


. = .; 
__start___ex_table = .; 
__ex_table : { *(__ex_table) } 
__stop___ex_table = .; 

. = ALIGN(4096); 
__init_begin = .; 
.text.init : { *(.text.init) } 
.data.init : { *(.data.init) } 
. = ALIGN(4096); 
__init_end = .; 

__bss_start = .; 
.bss  : 
{ 
*(.sbss) *(.scommon) 
*(.dynbss) 
*(.bss) 
*(COMMON) 
} 
_end = . ; 
PROVIDE (end = .); 
} 

जहां इस जानकारी के लिए देखने के लिए और कैसे परिवर्तन एलडीएस फ़ाइल में किया जाना पहचान करने के लिए: वर्गों में, जहां मैं निम्नलिखित जानकारी के महत्व को मिल सकती है?

कृपया स्वीकार करें या कम से कम जानकारी को पढ़ने के लिए कुछ संकेत दिए गए देते हैं, आप

regads, विजय

उत्तर

15

धन्यवाद पोर्ट यू-बूट करने के लिए, u-boot.lds शायद cpu निर्देशिका से इस्तेमाल किया जा सकता और बोर्ड निर्देशिका नहीं। दूसरे शब्दों में, इस फ़ाइल को बंद करने की शायद कोई आवश्यकता नहीं है। हालांकि, अगर यहां एक सिंहावलोकन है।

आप LD documentation में बहुत सारी जानकारी पा सकते हैं।

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

यदि आप कोड को उस विशिष्ट स्थान पर रखना चाहते हैं जिसे आप शिकायतकर्ता/लिंकर अनुमान लगाने की अपेक्षा नहीं कर सकते हैं तो एक कस्टम स्क्रिप्ट की आवश्यकता होती है। ऐसा करने के कई कारण हैं, क्योंकि मैं सूची बनाने की कोशिश करूंगा।

  1. स्थिरांक केवल पढ़ने के लिए स्मृति में रखा जा सकता है, तो राम विरल है
  2. मेमोरी कि एक बहुत उपलब्ध
  3. कुछ डेटा एक पर गठबंधन की जरूरत हो सकती है, तो तेजी से रैम में रखा जा करना पड़ सकता है पहुँचा जा सकता है निश्चित सीमा, जैसे 64K
  4. कुछ कोड (.text) रीसेट वेक्टर पर रखा जाना चाहिए ताकि इसे रीसेट पर निष्पादित किया जाता है
  5. ISR कोड के लिए एक ही वैक्टर

इसके अलावा, यह लिंक समय पर मेमोरी पॉइंटर्स तक सुविधाजनक पहुंच प्राप्त करने का एक तरीका हो सकता है। उदाहरण के लिए, __init_begin को एक प्रतीक के रूप में परिभाषित किया गया है जिसमें * .text.init के रूप में संकलित किसी भी कोड का स्मृति पता है। अब आप पूर्ण सी वातावरण कॉन्फ़िगर किए बिना प्रोग्राम काउंटर को __init_begin के मान पर सेट करके उस मेमोरी को कॉल कर सकते हैं।

संकलक प्रलेखन + u-बूट Makefiles व्याख्या करनी चाहिए कि कैसे और कब संकलक प्रत्येक प्रकार की वस्तु फ़ाइलों (उदा। .txt, .data, .bss, .fini, .ctors, आदि)

उत्पन्न करता है