linux-l: was bedeutet bzImage

Jens Dreger jens.dreger at physik.fu-berlin.de
Sa Mär 25 17:56:21 CET 2000


On Sat, Mar 25, 2000 at 03:48:12PM +0100, Juergen Rienaecker wrote:
> Hallo
> 
> Es gab da vor einem Monat eine Diskusion zum Thema bzImage.
> Ich, ein Linux-User, der auf Grund seiner dürftigen Englisch-
> kenntnisse nicht die "einzig seeligmachende Distribution"
> benutze, hatte aus der Tatsache, daß mein zImage mit 450 kB
> mit der neuen SuSE-6.3 plötztlich nicht mehr mit /sbin/lilo
> installierbar war, mit meinem Halbwissen geschlossen, daß
> es bei dem Fragesteller (lilo-Problem) um ein ähnliches
> Problem handelt. Ich hatte in meiner Einfalt angenommen,
> daß es sich bei bzImage um einen mit einem anderen Kompres-
> sionsverfahren gepackten Kernel handelt.

Falls es Dich beruhigt: Das habe ich bisher auch immer gedacht.
 
> 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.

Allerdings ist es auch nicht ganz einfach, herauszufinden, was denn
nun _wirklich_ der Unterschied zwischen zImage und bzImage ist.

Ich begebe mich hier etwas auf's Glatteis. Wer es besser weiss, moege
meine Darstellung zurechtruecken.

Um zu erkennen, was denn nun der wahre Unterschied ist, fang' ich mal
an mit zwei "trockenen" Kernel-Kompilierungen:

~> 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

Also nicht sehr viele Unterschiede. Tatsaechlich ist also der kernel
selbst in beiden Faellen _gleich_. Da "make -C dir" das Makefile im
Verzeichnis "dir" verwendet, begeben wir uns dorthin und schauen:

~> cd arch/i386/boot
~> less Makefile

Daraus geht hervor, dass zImage "compressed/vmlinux.out" verwendet,
bzImage dagegen "compressed/bvmlinux.out".

~> 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.

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.

Kann das jemand etwas genauer erklaeren ?

Danke,

Jens.

> PS. Warum haben die Anhänger der "alleinseeligmachenden" Distribution
> Alan Cox noch nicht bekehrt ?
Benutzt der denn nicht schon Redhat ? ;-)



Mehr Informationen über die Mailingliste linux-l