linux-l: was bedeutet bzImage
Harald Böhme
boehme at informatik.hu-berlin.de
Di Mär 28 17:43:57 CEST 2000
Hi
Die vorherigen Befindlichkeiten mal ausgeklammert.
> > Nun habe ich aber in "Linux Kernelprogrammierung"
> > 5. Auflage gerade auf Seite 11 gelesen:
> >
> > > Falls beim Erstellen von zImage eine Fehlermeldung kommt,
> > > daß der Kern zu groß für ein zImage ist, ruft man
> > > # make bzImasge
> > > auf. Dann wird ein noch stärker komprimierter bootfähiger
> > > Linux-Kern erstellt.
>
> Schmuh.
Dem muss ich leider zustimmen :-<
> ~> make -n zImage > zImage.out
> ~> make -n bzImage > bzImage.out
> ~> diff zImage.out bzImage.out
> 634c634
> < make -C arch/i386/boot zImage
> ---
> > make -C arch/i386/boot bzImage
Guter Ansatzt, aber es gibt vile Tricks, die man in der make-Ausgabe
nicht sieht. Also nicht wundern wenn man damit nicht alles findet.
> Also nicht sehr viele Unterschiede. Tatsaechlich ist also der kernel
> selbst in beiden Faellen _gleich_. Da "make -C dir" das Makefile im
Na nicht ganz wie du ja untern erklärst:
|| Diese Adressen werden dem Linker ueber die Option -Ttext mitgegeben,
|| denn der Linker muss wissen, wo sich der Code nachher befinden wird,
> Daraus geht hervor, dass zImage "compressed/vmlinux.out" verwendet,
> bzImage dagegen "compressed/bvmlinux.out".
Genau.
> ~> cd compressed
> ~> less Makefile
>
> Daraus nun geht hervor, dass zImage einen kernel produziert, der an
> Adresse 0x1000 (ZIMAGE_OFFSET) geladen wird, waehrend bzImage einen
> kernel backt, der an Adresse 0x100000 (BZIMAGE_OFFSET) geladen wird.
> Diese Adressen werden dem Linker ueber die Option -Ttext mitgegeben,
> denn der Linker muss wissen, wo sich der Code nachher befinden wird,
> wenn er gestartet wird. Lilo kommt dadurch ins Spiel, dass lilo den
> Kernel ja in den Speicher laden muss, und folglich auch wissen muss,
> wohin damit.
Das geht aber auch ohne LILO, der boot-Sektor des Kernel's muss es also
auch können. Also wer sich den Assembler antun möchte nur zu. Leider
werden dabei auch C-Makros benutzt, was die Lesbarkeit nicht sonderlich
erhöht.
> Ich vermute, dass fuer grosse Kernel die Startadresse 0x1000 ein
> Problem darstellt, weil bei 640K dieses bloede Speicher-Fenster mit
> den Erweiterungskarten liegt. Die Groesse von 508KB (DEF_SYSSIZE)
> fuer die Grenze ab der die Fehlermeldung "System is too big"
> erscheint, sieht mir dagegen sehr zufaellig gewaehlt aus.
Na genauso zufällig wie die Entwicklung der PC-Architektur.
> Kann das jemand etwas genauer erklaeren ?
Aber mal im Ernst; Der eigentliche Grund für die Einführung von bZImage
war doch, dass der Kernel im ausgepackten Zustand über mehr als 640k
erstrecken kann. D.h. in die unteren 640k des pysikalischen Specihers
passt er damit nicht mehr. Also muss er über 1M liegen. Die Relokation
wird ihm wie oben gesagt dann für 1M gegeben. Nun muss der LILO bzw. der
boot-Code das auch umsetzen. Dabei gibt es noch das leidige Problem der
Speichermodelle mit dem Prozessor zu lösen. Der im Anfangs-Mode nicht
so einfach den Code über die 64K-Grenzen mehr erreichen kann. Das ist
auch der eigentlich Grund für die Unterschiede im boot-Code.
Hmm für weitergehende Frage muss ich mich dann auch an Michael wenden,
mein x86-Assembler ist nicht so besonders gut.
MvG
Harald
--
<<<< Harald Böhme, Berlin 12489 >>>>
<<<< Radicke Str. 52 >>>>
<<<< boehme at informatik.hu-berlin.de >>>>
Mehr Informationen über die Mailingliste linux-l