2010-12-07 21 views
7

Uboot uygulamasının powerpc mpc8313 işlemci tabanlı panosunda nasıl yapıldığını anlamaya çalışıyorum. Bu prosedür sırasında uboot.lds, linker script dosyası olarak adlandırılan dosyaya rastladım.uboot.lds öğesinin anlaşılması

Bu dosyayı anlamalıyım. Belirtilen içeriklerin önemi ve gerçek adreslerin uboot paketinde tanımlandığı anlamına gelir. Örneğin;

;

/* 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 = .); 
} 

bu bilgi aramak için ve nasıl LDS dosyasında yapılması gereken değişiklikleri tespit etmek: BÖLÜMDE içinde, nerede aşağıdaki bilgilerin önemini bulabilirim?

bilgileri okumak için bazı öneriler vermek en az kabul veya Lütfen, liman u önyükleme için size

regads, Vijay

cevap

15

teşekkür, u-boot.lds muhtemelen cpu dizinden kullanılabilir ve yönetim kurulu dizini değil. Diğer bir deyişle, muhtemelen bu dosyayı taşımanıza gerek yoktur. Ancak, eğer burada varsa, genel bir bakış.

LD documentation'da birçok bilgiyi bulabilirsiniz. Genel olarak, hangi LD betiklerinin yapmanıza izin verdiğinizi, GCC araç zincirinin işleri çalıştırırken belleğe yerleştirdiği varsayılan yerleri geçersiz kılmaktır. Üste | Bir uygulamayı derlediğinizde, kaynak kodu işlenir ve makine kodu içeren nesne kodu dosyaları oluşturulur. Bağlama sırasında çeşitli nesne dosyaları tek bir dosyada birleştirilebilir, örneğin ELF yürütülebilir ve gerektiğinde bulunabilmesi için her nesne dosyasının belleğe yerleştirileceği OS'ye söylemek için dosyaya bir başlık yerleştirilir (globals, function) çağrılar, vb.)

Kodu, derleyici/linker'ın tahmin edemeyeceği belirli bir yere yerleştirmek istiyorsanız özel bir komut dosyası gereklidir. Bunu yapmaya çalışacağım, bunun için birçok neden var.

    RAM seyrek ise
  1. Sabitler Salt Okunur bellekte yerleştirilebilir
  2. mevcut
  3. Bazı veriler bir üzerinde hizalanmış gerekebilir eğer çok daha hızlı RAM yerleştirilen gerekebilir erişilir
  4. Bellek belirli sınır gibi, 64 K
  5. bu reset yürütülür, böylece bazı kodu (.TEXT) sıfırlama vektörü yerleştirilmelidir
  6. ISR kodu için aynı
vektörleriBunun yanı sıra, bağlantı zamanında bellek işaretçilerine rahat erişim elde etmek için bir yol olabilir. Örneğin, __init_begin * .text.init olarak derlenmiş herhangi bir kodun hafıza adresini içeren bir sembol olarak tanımlanır. Program belleğini, yapılandırılmış tam bir C ortamı olmadan __init_begin değerine ayarlayarak şimdi bu belleği çağırabilirsiniz. derleyici nesne her türdeki dosyaları (örn. .txt, .data, .bss, .fini, .ctors vs.)

oluşturduğunda

derleyici belgelerine + u-çizme Makefile'lar nasıl ve açıklamalıdır

İlgili konular