Beim Durchsuchen der Kernel-Makefiles habe ich diese Begriffe gefunden. So würde Ich mag wissen , was ist der Unterschied zwischen vmlinux
, vmlinuz
, vmlinux.bin
, zimage
und bzimage
?
linux
kernel
file-format
Sen
quelle
quelle
vmlinuz.efi
auf Ubuntu 14.04 verwendet: askubuntu.com/questions/330541/what-is-vmlinuz-efiAntworten:
vmlinux
Dies ist der Linux-Kernel in einem statisch verknüpften ausführbaren Dateiformat. Im Allgemeinen müssen Sie sich um diese Datei keine Sorgen machen, sie ist nur ein Zwischenschritt beim Startvorgang.
Die rohe vmlinux-Datei kann zu Debugging-Zwecken nützlich sein.
vmlinux.bin
Dasselbe wie vmlinux, jedoch in einem bootfähigen Raw-Binärdateiformat. Alle Symbole und Versetzungsinformationen werden verworfen. Erstellt
vmlinux
vonobjcopy -O binary vmlinux vmlinux.bin
.vmlinuz
Die vmlinux-Datei wird normalerweise mit komprimiert
zlib
. Seit 2.6.30LZMA
undbzip2
sind auch verfügbar. Durch Hinzufügen weiterer Boot- und Dekomprimierungsfunktionen zu vmlinuz kann das Image zum Booten eines Systems mit dem vmlinux-Kernel verwendet werden. Die Komprimierung von vmlinux kann mit zImage oder bzImage erfolgen.Die Funktion
decompress_kernel()
übernimmt die Dekomprimierung von vmlinuz beim Booten. Eine Meldung zeigt Folgendes an:zImage (
make zImage
)Dies ist das alte Format für kleine Kernel (komprimiert, unter 512 KB). Beim Booten wird dieses Image nur noch wenig Arbeitsspeicher (die ersten 640 KB des Arbeitsspeichers).
bzImage (
make bzImage
)Das große zImage (das hat nichts damit zu tun
bzip2
) wurde erstellt, während der Kernel wuchs und größere Bilder handhabte (komprimiert, über 512 KB). Das Bild wird hoch in den Speicher geladen (über 1 MB RAM). Da die heutigen Kernel weit über 512 KB groß sind, ist dies normalerweise der bevorzugte Weg.Eine Überprüfung auf Ubuntu 10.10 zeigt:
quelle
/arch/$ARCH/boot/compressed/misc.c
, siehe hier: lxr.linux.no/#linux+v2.6.37/arch/x86/boot/compressed/...Erstellen Sie einen ausführlichen Kernel und suchen Sie nach den Dateien
Dieser Ansatz kann einige Einblicke geben, wird nie veraltet sein und Ihnen helfen, auf einfache Weise herauszufinden, welcher Teil des Build-Systems was tut.
Sobald Sie eine Build-Konfiguration haben, die eine der Dateien generiert, erstellen Sie mit:
Ändern Sie einen Kommentar zu einer C-Datei, um eine Neuverknüpfung zu erzwingen (z. B.
init/main.c
eine gute), wenn Sie diese bereits zuvor erstellt haben.Überprüfen Sie nun die gewünschten
f.log
Bilder und suchen Sie sie.In Version 4.19 werden wir beispielsweise Folgendes feststellen:
Thin-Archive werden erwähnt unter: https://stackoverflow.com/questions/2157629/linking-static-libraries-to-other-static-libraries/27676016#27676016 Es handelt sich um Archive, die nur auf andere Archive / Objekte verweisen, anstatt sie zu kopieren.
Der Kernel wurde von inkrementellen Verknüpfungen zu Thin Archiven in Version 4.9 verschoben, wie unter https://stackoverflow.com/questions/29391965/what-is-partial-linking-in-gnu-linker/53959624#53959624 beschrieben
Vollständige Protokollinterpretation
Wenn wir die ausführlichen Build-Protokolle von Anfang an lesen, sehen wir zuerst:
also sind diese beiden nur miteinander verbunden.
Dann suchen wir etwas weiter
x86/boot/bzImage
und finden:arch/x86/boot/tools/build
ist eine ausführbare Datei, also führen wir sie aus, siehe die Hilfemeldung:und grep um die Quelle zu finden:
Also muss dieses Tool
arch/x86/boot/bzImage
ausarch/x86/boot/vmlinux.bin
und anderen Dateien generieren . TODO, worum geht esbuild
genau?Wenn wir folgen
arch/x86/boot/vmlinux.bin
, sehen wir, dass es nur einobjcopy
von istarch/x86/boot/compressed/vmlinux
:und
arch/x86/boot/compressed/vmlinux
ist nur eine reguläre ELF-Datei:ls -hlSr
sagt, daspiggy.o
ist bei weitem die größte Datei, also suchen wir danach und sie muss kommen von:.tmp_
Präfix unten erklärt.arch/x86/boot/compressed/piggy.S
enthält:Siehe auch: https://stackoverflow.com/questions/4158900/embedding-resources-in-executable-using-gcc/36295692#36295692
arch/x86/boot/compressed/vmlinux.bin.gz
kommt von:was kommt von:
was kommt von:
was macht:
vmlinux
ist riesig, aber alle gezeigten Objekte sind winzigls -l
, daher habe ich nach einer neuenar
Funktion gesucht und gelernt, die ich nicht kannte: dünne Archive.Beim:
Der Build macht:
T
Gibt das Thin-Archiv an.Wir können dann sehen, dass alle Unterarchive auch dünn sind, z. B.
init/main.c
haben wir seit meiner Änderung :Das kommt schließlich aus der C-Datei durch einen Befehl wie:
Ich kann das nicht finden
init/.tmp_main.o
,init/main.o
um auf die Protokolle zu treten, was eine Schande ist ... mit:wir sehen das kommt wahrscheinlich von
scripts Makefile.build
und ist mit dem verbundenCONFIG_MODVERSIONS
was ich aktiviert hatte:Analyse mit dieser Konfiguration durchgeführt, die enthält
CONFIG_KERNEL_GZIP=y
.aarch64
arch/arm64/boot/Image
Nur eine unkomprimierte
objcopy
vonvmlinux
:vmlinux
wird im Grunde auf die gleiche Weise wie für x86 durch die dünnen Archive erhalten.arch/arm/boot/zImage
Sehr ähnlich zu X86 mit einem Reißverschluss
vmlinux
, aber ohne Zauberschrittbuild.c
. Zusammenfassung der Aufrufkette:QEMU v4.0.0 kann von bzImage aber nicht von vmlinux booten
Dies ist ein weiterer wichtiger praktischer Unterschied: https://superuser.com/questions/1451568/booting-an-uncompressed-kernel-in-qemu
quelle
Es ist alles hier: http://en.wikipedia.org/wiki/Vmlinux
quelle
vmlinux :
Ein nicht komprimiertes und nicht bootfähiges Linux-Kernel-Dateiformat, nur ein Zwischenschritt zur Produktion
vmlinuz
.vmlinuz :
Eine komprimierte und bootfähige Linux- Kerneldatei . Es ist tatsächlich
zImage
oderbzImage
Datei.zBild :
Für alte Kernel passen Sie einfach die
640k
RAM-Größe an.bzImage :
Big zImage
keine640k
RAM - Größe zu begrenzen, kann viel größer.Bitte beziehen Sie sich auf dieses Dokument: vmlinuz Definition .
quelle
bzImage ist das Ziel für x86-Architekturen, die mit dem PC-BIOS arbeiten. Im Gegensatz dazu ist zImage ein architekturspezifisches Ziel, das am häufigsten für eingebettete Geräte verwendet wird und mit ihren Bootloadern gut funktioniert.
quelle