En parcourant les Makefiles du noyau, j'ai trouvé ces termes. Je voudrais donc savoir quelle est la différence entre vmlinux
, vmlinuz
, vmlinux.bin
, zimage
& bzimage
?
50
En parcourant les Makefiles du noyau, j'ai trouvé ces termes. Je voudrais donc savoir quelle est la différence entre vmlinux
, vmlinuz
, vmlinux.bin
, zimage
& bzimage
?
vmlinuz.efi
utilisé sur Ubuntu 14.04: askubuntu.com/questions/330541/what-is-vmlinuz-efiRéponses:
vmlinux
Il s’agit du noyau Linux dans un format de fichier exécutable lié statiquement. Généralement, vous n'avez pas à vous soucier de ce fichier, ce n'est qu'une étape intermédiaire dans la procédure de démarrage.
Le fichier vmlinux brut peut être utile à des fins de débogage.
vmlinux.bin
Identique à vmlinux, mais dans un format de fichier binaire brut amorçable. Tous les symboles et toutes les informations de déplacement sont supprimés. Généré
vmlinux
parobjcopy -O binary vmlinux vmlinux.bin
.vmlinuz
Le fichier vmlinux est généralement compressé avec
zlib
. Depuis 2.6.30LZMA
etbzip2
sont également disponibles. En ajoutant d'autres fonctionnalités de démarrage et de décompression à vmlinuz, l'image peut être utilisée pour démarrer un système avec le noyau vmlinux. La compression de vmlinux peut se produire avec zImage ou bzImage.La fonction
decompress_kernel()
gère la décompression de vmlinuz au démarrage, un message indique ceci:zImage (
make zImage
)C'est l'ancien format pour les petits noyaux (compressé, inférieur à 512 Ko). Au démarrage, cette image est chargée en mémoire (les 640 premiers Ko de la RAM).
bzImage (
make bzImage
)La grande zImage (cela n'a rien à voir avec
bzip2
), a été créée alors que le noyau grandissait et gérait des images plus grandes (compressées, supérieures à 512 Ko). L'image est chargée en mémoire (supérieure à 1 Mo de RAM). Les noyaux actuels dépassant largement les 512 Ko, c'est généralement la méthode préférée.Une inspection sur Ubuntu 10.10 montre:
la source
/arch/$ARCH/boot/compressed/misc.c
, voir ici: lxr.linux.no/#linux+v2.6.37/arch/x86/boot/compressed/…Faire une compilation verbeuse du noyau et rechercher les fichiers
Cette approche peut donner un aperçu, ne sera jamais démodée et vous aidera à trouver facilement quelle partie du système de compilation fait quoi.
Une fois que vous avez une configuration de construction qui génère l’un des fichiers, construisez-la avec:
Modifiez un commentaire sur un fichier C pour forcer une nouvelle liaison (par exemple,
init/main.c
un bon) si vous avez déjà construit précédemment.Maintenant, inspectez
f.log
et recherchez les images qui vous intéressent.Par exemple, sur la v4.19, nous conclurons que:
Les archives minces sont mentionnées sur: https://stackoverflow.com/questions/2157629/linking-static-libraries- to -other - static - libraries / 27676016#27676016. Ce sont des archives qui pointent simplement sur d'autres archives / objets au lieu de les copier.
Le noyau est passé de la liaison incrémentielle aux archives minces dans la v4.9, comme décrit à l' adresse : https://stackoverflow.com/questions/29391965/what-is-partial-linking-in-gnu-linker/53959624#53959624
Interprétation complète du journal
Lorsque nous commençons à lire les journaux de construction détaillés à partir de la sauvegarde, nous voyons d’abord:
donc ces deux sont juste symlinked.
Ensuite, nous cherchons un peu plus loin
x86/boot/bzImage
et trouvons:arch/x86/boot/tools/build
est un exécutable, nous le lançons donc, voir le message d'aide:et grep pour trouver la source:
Donc, cet outil doit générer à
arch/x86/boot/bzImage
partir d'arch/x86/boot/vmlinux.bin
autres fichiers TODO et à quoi sertbuild
exactement?Si nous suivons,
arch/x86/boot/vmlinux.bin
nous voyons qu'il ne s'agit queobjcopy
dearch/x86/boot/compressed/vmlinux
:et
arch/x86/boot/compressed/vmlinux
est juste un fichier ELF normal:ls -hlSr
dit quepiggy.o
c'est de loin le fichier le plus volumineux, alors nous le recherchons, et il doit provenir de:.tmp_
préfixe expliqué ci-dessous.arch/x86/boot/compressed/piggy.S
contient:voir aussi: https://stackoverflow.com/questions/4158900/embedding-resources-in-executable-using-gcc/36295692#36295692
arch/x86/boot/compressed/vmlinux.bin.gz
vient de:qui vient de:
qui vient de:
qui fait:
vmlinux
est énorme, mais tous les objets montrés sont minusculesls -l
, j’ai donc cherché et découvert une nouvellear
fonctionnalité que je ne connaissais pas: les archives minces.À:
la construction fait:
T
spécifie l'archive mince.Nous pouvons alors voir que toutes les sous-archives sont également minces, par exemple, depuis que j'ai modifié
init/main.c
, nous avons:qui vient finalement du fichier C via une commande comme:
Je n'arrive pas à trouver le moyen
init/.tmp_main.o
deinit/main.o
marcher sur les bûches, ce qui est dommage ... avec:nous voyons que cela vient probablement de
scripts Makefile.build
et est lié àCONFIG_MODVERSIONS
ce que j’avais activé:Analyse faite avec cette config qui contient
CONFIG_KERNEL_GZIP=y
.aarch64
arch/arm64/boot/Image
Juste un non compressé
objcopy
devmlinux
:vmlinux
est obtenu de la même manière que pour les archives minces.arch/arm/boot/zImage
Très semblable au X86 avec un zip
vmlinux
, mais pas d'build.c
étape magique . Résumé de la chaîne d'appels:QEMU v4.0.0 peut démarrer à partir de bzImage mais pas de vmlinux
Il existe une autre différence pratique importante: https://superuser.com/questions/1451568/booting-an-uncompressed-kernel-in-qemu
la source
Tout est là: http://en.wikipedia.org/wiki/Vmlinux
la source
vmlinux :
Un format de fichier du noyau Linux non compressé et non amorçable, une étape intermédiaire dans la production
vmlinuz
.vmlinuz :
fichier de noyau Linux compressé et amorçable. C'est réellement
zImage
oubzImage
fichier.zImage :
Pour les anciens noyaux, ajustez simplement la
640k
taille du bélier.bzImage :
Big zImage
, aucune640k
limite de taille de la RAM, peut beaucoup plus grande.Veuillez vous référer à ce document: Définition de vmlinuz .
la source
bzImage est la cible utilisée pour les architectures x86 fonctionnant avec le BIOS du PC. En revanche, zImage est une cible spécifique à l’architecture la plus couramment utilisée pour les périphériques intégrés et fonctionne bien avec leurs chargeurs de démarrage.
la source