2013-03-20 6 views
5

Wir versuchen, ein Linux-Image in unserem DRAM an einem bestimmten Speicherort zu laden, ist die 0x350000000 DRAM-Endadresse, die wir aus Boot-Log kennen, die "mem Gerät endet Adresse ist 0x80000000" .Wir unser Bild geladen wird unter der Adresse ‚0x5000000‘ und davor variuos Abschnitt in Bild irgend Adresse geladen zu werden, die größer ist, als ‚0x80000000‘, für eaxmple wieder von Boot-ProtokollenWie lade ich Linux Image Speicherplatz

loading section to address 0xc5000000 from file position 0x1000, size is 0x5ac13e 

was Bedeutung von "von Dateiposition 0x1000" in der obigen Zeile.

ersten Abschnitt, der geladen ist .text Abschnitt, unten ist unser vmlinux Bild Dump Abschnitt Kopf

[Nr]  Name   Type   Addr  Off Size ES Flg Lk Inf Al 

[ 0]      NULL   00000000 000000 000000 00  0 0 0 

[ 1] .text   PROGBITS  c5000000 001000 5ac13e 00 AX 0 0 4096 

[ 2]  .notes   NOTE   c55ac140 5ad140 000168 00 AX 0 0 4 

[ 3] __ex_table  PROGBITS  c55ac2b0 5ad2b0 000fe0 00 A 0 0 4 

[ 4] .rodata   PROGBITS  c55ae000 5af000 20a930 00 A 0 0 64 

[ 5] __bug_table  PROGBITS  c57b8930 7b9930 0075fc 00 A 0 0 1 

[ 6] .pci_fixup  PROGBITS  c57bff2c 7c0f2c 001a90 00 A 0 0 4 

[ 7] .builtin_fw  PROGBITS  c57c19bc 7c29bc 0000cc 00 A 0 0 4 

Es ist eine ziemlich große Liste, also nicht voll .Aber eine Sache haben schreiben wir hier sehen können. Der Textbereich ist größer als die DRAM-Endadresse, daher sollte das Bild nicht ordnungsgemäß übertragen werden, obwohl nach dem Laden des ersten Abschnitts kein Fehler auftritt, es aber weiterhin andere Abschnitte lädt, aber nach dieser Nachricht hängt es.

program load complete, entry point: 0x5000000, size: 0x92e7fc 

Meine Frage ist, wie kann ich diese verschiedenen Abschnitte Adresse an unsere DRAM-Adresse auszurichten, ist objcopy Dienstprogramm hier verwendet werden könnte Adresse dieser verschiedenen Abschnitte zu ändern.

Gibt es eine Möglichkeit, diese Abschnittsadressen vor der Kompilierung zu setzen? Zweite Sache, was Grund für dieses Hang Afer Programm Laden abgeschlossen sein könnte.

+0

Eine Prämie gut gleiche brauchen, ist aber nicht unbedingt Sie eine Lösung in Gang zu bringen, weil die Frage nicht ausreichend informativ ist und weil wir Ihren Code nicht sehen können. Sie bitten die Leute im Grunde, im Dunkeln zu schießen. –

+0

Ja, Alexey, du hast meine Frage schon sehr gut beantwortet, ich dachte mir mehr über diese Frage zu sehen ist eine gute Idee.Ich will nicht, dass Leute mein Problem lösen, denn dann werde ich nicht selbst lernen, wollte nur ein Paar haben von guten Ideen –

+0

Guter Punkt, eigentlich. –

Antwort

6

from file position 0x1000 bedeutet, was es sagt. Sie haben es in der dump:

[Nr]  Name   Type   Addr  Off Size ES Flg Lk Inf Al 
... 
[ 1] .text   PROGBITS  c5000000 001000 5ac13e 00 AX 0 0 4096 

Es ist, wo der .text Abschnitt in der Datei beginnt, bei Offset 0x1000.

Aber eine Sache, die wir hier .text Abschnitt sehen kann, ist größer als DRAM Endadresse

Nein, es ist nicht größer (nicht im Sinne von größer, zumindest), ist es kompiliert in der Erwartung, dass es unter der Adresse 0xc5000000 in den Speicher geladen wird.

so Bild nicht richtig loded werden soll, wenn wir nach dem Laden ersten Abschnitts hält beim Laden andere Abschnitte

Das Bild überall geladen werden keine Fehler bekommen kann, dann ist es nur Daten für die Zwecke der Wird geladen.

OTOH, wenn loading section to address 0xc5000000 bedeutet, was es sagt, die Datei wird in nirgendwo geladen, da Ihr RAM bei 0x7fffffff endet.

aber nach dieser Nachricht hängt es.

Und das ist zu erwarten. Maschinencode ist selten positionsunabhängig. Wenn Sie ihn also an einem anderen Ort laden als dort, wo er geladen werden soll, funktioniert er nicht. Oder wenn es nicht einmal geladen wird, was werden Sie dann ausführen? Müll.

Gibt es eine Möglichkeit, diese Abschnittsadressen vor der Kompilierung zu setzen?

auf dem System Je Sie eine der beiden Optionen aus, oder beides haben können:

  • einrichten Seite Übersetzung in einer solchen Art und Weise, dass virtuelle Adressen von 0xc5000000 und bis Karte auf physikalische Adressen von 0x5000000 und für das gesamte Programm bis
  • die Linker-Skript finden, die Ihr Compiler verwendet, und die Anfangsadresse Abschnitt 0xc5000000-0x5000000 ändern, google dies, siehe Compiler/Linker Dokumentation

Auch ist es ein bisschen seltsam, dass der Einstiegspunkt bei 0x5000000 ist. Nicht, dass das notwendigerweise falsch ist, es ist nur so, dass es selten der Fall ist. Ich würde sicherstellen, dass das start Etikett (oder _start oder was auch immer es ist) tatsächlich die gleiche Adresse wie der Anfang des .text Abschnitts erhält. Wenn dies aus irgendeinem Grund nicht der Fall ist, stimmt etwas mit dem Linker-Skript oder den Compiler/Linker-Befehlszeilenoptionen oder mit dem Loader nicht.

+0

Dank @Alexey für Ihre freundliche Antwort.Koupel der Dinge möchte mit Ihnen teilen, die ich in meiner Frage verpasst, wird der Einstiegspunkt 0x5000000 von uns geändert, indem Sie die .config-Datei des Kernels ändern, weil Bild nicht auf die Standardadresse geladen werden konnte 0x1000000. Die zweite Sache ist, dass wir früher ein QNX-basiertes Kernel-Image auf denselben DRAM geladen und ausgeführt haben. Nun können wir dieselben Adressen für Sektionen und Eingangspunkt-Adressen verwenden, die für das QNX-Image für das Linux-Kernel-Image und einen weiteren Punkt verwendet wurden dass Sie den Einstiegspunkt erstellt haben, ist Teil des .text-Abschnitts. –

+0

Ist das 'jetzt können wir die gleichen Adressen für Abschnitte und Einstiegspunkt Adresse, die für QNX Bild hier für Linux-Kernel-Bild verwendet wurden 'eine Frage? Ich verstehe Ihren Standpunkt nicht ganz. –

+0

Hallo Alesxey wie Sie vorgeschlagen, nach dem Ändern der Seite Offset-Wert, bekam die Abschnitt Adresse innerhalb der 2 GB Bereich und nach Programm laden abgeschlossen, Nachricht unser Bild nicht hängen, aber wir lief in andere Problem, bald sagt Programm laden abgeschlossen, Die CPU wird zurückgesetzt, anstatt dem Linux-Kernel-Image die Kontrolle zu geben. Ich würde gerne ein oder zwei Worte von Ihrem Ende zu diesem Thema hören. –

3

Welchen Lader verwenden Sie? Wie ist die Form des "Bildes"? U-Boot-Image, Raw, vmlinux-ELF-Datei? Ich schätze, der letzte beurteilt nach der Existenz von Sektionen usw. Aus der ELF-Datei sollten Sie nicht Abschnitte, sondern so genannte Programmheader laden. Zum Beispiel dies die OpenRISC ist die Auflistung Linux-Kernel-Programm-Header (erhalten unter Verwendung readelf -l):

Elf file type is EXEC (Executable file) 
Entry point 0xc0000000 
There are 2 program headers, starting at offset 52 

Program Headers: 
    Type   Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align 
    LOAD   0x002000 0xc0000000 0x00000000 0x231728 0x232000 RWE 0x2000 
    LOAD   0x234000 0xc0232000 0x00232000 0x17c78c 0x18bfcc RWE 0x2000 

Section to Segment mapping: 
    Segment Sections... 
    00  .text .rodata __ksymtab __ksymtab_gpl __ksymtab_strings __param __modver 
    01  .data __ex_table .head.text .init.text .init.data .bss 

Sehen Sie den Unterschied zwischen VirtAddr und PhysAddr (fiel c aufgrund üblichen Linux-Kernel-Mapping). Natürlich sollte die physikalische Adresse zum Laden verwendet werden.

Der Grund, dass Kernel virtuelle Adressen für Symbole, Abschnitte usw. verwendet, ist, dass Sie während des Bootens schnell den Moment eingeben, wenn die MMU initialisiert wird, die virtuellen Adressen sind dann die einzig gültigen.

Und schließlich, über das Ändern dieser Adressen. In der Tat, wie von Alexey gezeigt, ist Linker-Skript der Schlüssel. Sie finden diese unter arch/(your arch)/kernel/vmlinux.lds.S. Aber der Punkt ist, das ist IMO nicht dein Problem, das Problem liegt wahrscheinlich im Lader oder seinen Optionen.

1

Überprüfen Sie Ihre arch/arm/mach-xxx/Makefile.boot (Sie verwenden Armbrett richtig?)

zreladdr-y  += 0x80008000 
params_phys-y  := 0x80000100 
initrd_phys-y  := 0x80800000 

Dies ist aus Ti OMAP3 Chip.

Wie ich glaube, Sie die

+0

Danke für die Antwort @liyaoshi, aber wir sind auf x86 Board –

+0

Sorry für diese Antwort, mache ich einen Fehler. Ich dachte 0x80000000 es war Startadresse Ihres Boards. – liyaoshi

Verwandte Themen