2010-12-07 4 views
7

Ich versuche zu verstehen, wie die Portierung von Uboot auf powerPC mpc8313 Prozessor-basierten Board erfolgt. Während dieser Prozedur stieß ich auf die Datei namens uboot.lds, Linker-Skript-Datei.Understanding of uboot.lds

Ich muss diese Datei verstehen. Ich meine die Bedeutung der genannten Inhalte und wo die tatsächlichen Adressen im Uboot-Paket definiert sind.

zum Beispiel; In den Abschnitten, wo kann ich die Bedeutung der folgenden Informationen:

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

wo diese Informationen zu suchen und wie die Änderungen zu identifizieren, in HLT-Datei zu tun?

Bitte bestätigen oder zumindest einige Hinweise zu geben, die Informationen zu lesen, danke

Regads, Vijay

Antwort

15

Zum Anschluss u-boot, können die u-boot.lds wahrscheinlich aus dem CPU-Verzeichnis verwendet werden und nicht das Board-Verzeichnis. Mit anderen Worten, diese Datei muss wahrscheinlich nicht portiert werden. Wenn es dann aber einen Überblick gibt.

Sie können viele Informationen in der LD documentation finden.

Im Allgemeinen ermöglichen es Ihnen LD-Skripts, die Standardorte zu überschreiben, an denen die GCC-Toolkette beim Ausführen Dinge im Speicher ablegt. Wenn Sie eine Anwendung kompilieren, wird der Quellcode verarbeitet und Objektcodedateien mit Maschinencode erstellt. Während der Verknüpfung werden die verschiedenen Objektdateien zu einer Datei zusammengefasst, zum Beispiel ELF, und ein Header wird auf die Datei gelegt, um dem Betriebssystem mitzuteilen, wo jede Objektdatei gespeichert werden soll, damit sie bei Bedarf gefunden werden kann (globals, function) Anrufe usw.)

Ein benutzerdefiniertes Skript wird benötigt, wenn Sie den Code an einer bestimmten Stelle platzieren möchten, die der Compiler/Linker nicht erwarten kann. Dafür gibt es viele Gründe, ich werde versuchen aufzulisten.

  1. Konstanten können in Read-Only-Speicher gesetzt werden, wenn RAM
  2. spärlich ist Speicher, der vielen Zugriff benötigen
  3. Einige Daten, wenn in einem schnelleren RAM platziert werden können auf einem ausgerichtet werden müssen bestimmte Grenze, beispielsweise 64K
  4. einig Code (.TEXT) sollten so an dem Rücksetzvektor platziert werden, dass sie beim Rücksetzen ausgeführt wird
  5. das Gleiche gilt für ISR Codevektoren

Darüber hinaus kann es eine Möglichkeit sein, einen bequemen Zugriff auf Speicherzeiger zur Verknüpfungszeit zu erhalten. Zum Beispiel ist __init_begin als ein Symbol definiert, das die Speicheradresse eines beliebigen als * .text.init kompilierten Codes hat. Sie können diesen Speicher jetzt aufrufen, indem Sie den Programmzähler auf den Wert von __init_begin setzen, ohne dass eine vollständige C-Umgebung konfiguriert ist.

Das Compiler Dokumentation + u-boot Makefiles sollte erklären, wie und wann die Compiler Objektdateien jeden Typen erzeugt (ex. .txt, .data .bss, .fini, .ctors, etc.)