Mientras navegaba por los Kernel Makefiles, encontré estos términos. Así que me gustaría saber cuál es la diferencia entre vmlinux
, vmlinuz
, vmlinux.bin
, zimage
y bzimage
?
linux
kernel
file-format
Sen
fuente
fuente
vmlinuz.efi
usa en Ubuntu 14.04: askubuntu.com/questions/330541/what-is-vmlinuz-efiRespuestas:
vmlinux
Este es el kernel de Linux en un formato de archivo ejecutable enlazado estáticamente. En general, no tiene que preocuparse por este archivo, es solo un paso intermedio en el procedimiento de arranque.
El archivo vmlinux sin formato puede ser útil para fines de depuración.
vmlinux.bin
Lo mismo que vmlinux, pero en un formato de archivo binario sin formato de arranque. Todos los símbolos y la información de reubicación se descartan. Generado a partir
vmlinux
deobjcopy -O binary vmlinux vmlinux.bin
.vmlinuz
El archivo vmlinux generalmente se comprime con
zlib
. Desde 2.6.30LZMA
ybzip2
también están disponibles. Al agregar más capacidades de arranque y descompresión a vmlinuz, la imagen se puede usar para arrancar un sistema con el kernel vmlinux. La compresión de vmlinux puede ocurrir con zImage o bzImage.La función
decompress_kernel()
maneja la descompresión de vmlinuz en el arranque, un mensaje indica esto:zImage (
make zImage
)Este es el formato antiguo para núcleos pequeños (comprimido, por debajo de 512 KB). En el arranque, esta imagen se carga con poca memoria (los primeros 640 KB de RAM).
bzImage (
make bzImage
)La gran zImage (esto no tiene nada que ver con esto
bzip2
), se creó mientras el núcleo crecía y maneja imágenes más grandes (comprimidas, más de 512 KB). La imagen se carga en la memoria (por encima de 1 MB de RAM). Como los núcleos actuales superan los 512 KB, esta suele ser la forma preferida.Una inspección en Ubuntu 10.10 muestra:
fuente
/arch/$ARCH/boot/compressed/misc.c
, ver aquí: lxr.linux.no/#linux+v2.6.37/arch/x86/boot/compressed/…Realice una compilación detallada del núcleo y busque los archivos
Este enfoque puede dar una idea, nunca se desactualizará y lo ayudará a encontrar fácilmente qué parte del sistema de compilación está haciendo qué.
Una vez que tenga una configuración de compilación que genere uno de los archivos, compile con:
Modifique un comentario en algún archivo C para forzar un reenlace (por ejemplo,
init/main.c
es bueno) si ya lo ha compilado anteriormente.Ahora, inspeccione
f.log
y busque las imágenes de interés.Por ejemplo, en v4.19 concluiremos que:
Los archivos delgados se mencionan en: https://stackoverflow.com/questions/2157629/linking-static-libraries-to-other-static-libraries/27676016#27676016 Son archivos que solo apuntan a otros archivos / objetos en lugar de copiarlos.
El núcleo se movió de la vinculación incremental a archivos delgados en v4.9 como se describe en: https://stackoverflow.com/questions/29391965/what-is-partial-linking-in-gnu-linker/53959624#53959624
Interpretación completa del registro
Cuando comenzamos a leer los registros detallados de compilación desde la copia de seguridad, primero vemos:
entonces esos dos solo están enlazados.
Luego buscamos un poco más
x86/boot/bzImage
y encontramos:arch/x86/boot/tools/build
es un ejecutable, así que lo ejecutamos, vea el mensaje de ayuda:y grep para encontrar la fuente:
Entonces, esta herramienta debe estar generando
arch/x86/boot/bzImage
desdearch/x86/boot/vmlinux.bin
y otros archivos TODO, ¿para qué sirvebuild
exactamente?Si seguimos
arch/x86/boot/vmlinux.bin
, vemos que es soloobjcopy
dearch/x86/boot/compressed/vmlinux
:y
arch/x86/boot/compressed/vmlinux
es solo un archivo ELF normal:ls -hlSr
dice quepiggy.o
es, con mucho, el archivo más grande, por lo que lo buscamos y debe provenir de:.tmp_
prefijo explicado a continuación.arch/x86/boot/compressed/piggy.S
contiene:ver también: https://stackoverflow.com/questions/4158900/embedding-resources-in-executable-using-gcc/36295692#36295692
arch/x86/boot/compressed/vmlinux.bin.gz
viene de:que proviene de:
que proviene de:
que hace:
vmlinux
es enorme, pero todos los objetos mostrados son pequeños de acuerdo con estols -l
, así que investigué y aprendí sobre una nuevaar
característica que no conocía: archivos delgados.A:
la construcción hace:
T
especifica el archivo delgado.Entonces podemos ver que todos los subarchivos también son delgados, por ejemplo, desde que modifiqué
init/main.c
, tenemos:que finalmente proviene del archivo C a través de un comando como:
No puedo encontrar el
init/.tmp_main.o
queinit/main.o
pise los registros que es una pena ... con:vemos que probablemente proviene
scripts Makefile.build
y está vinculado aCONFIG_MODVERSIONS
lo que había habilitado:Análisis realizado con esta configuración que contiene
CONFIG_KERNEL_GZIP=y
.aarch64
arch/arm64/boot/Image
Solo un sin comprimir
objcopy
devmlinux
:vmlinux
se obtiene básicamente de la misma manera que para x86 a través de los archivos delgados.arch/arm/boot/zImage
Muy similar a X86 con cremallera
vmlinux
, pero sinbuild.c
paso mágico . Resumen de la cadena de llamadas:QEMU v4.0.0 puede arrancar desde bzImage pero no vmlinux
Esta es otra diferencia práctica importante: https://superuser.com/questions/1451568/booting-an-uncompressed-kernel-in-qemu
fuente
Todo está aquí: http://en.wikipedia.org/wiki/Vmlinux
fuente
vmlinux :
Un formato de archivo de kernel de Linux no comprimido y no arrancable, solo un paso intermedio para la producción
vmlinuz
.vmlinuz :
un archivo de kernel de Linux comprimido y de arranque. En realidad es
zImage
obzImage
archivo.zImage :
para núcleos antiguos, simplemente ajuste el
640k
tamaño del ram.bzImage :
Big zImage
sin640k
límite de tamaño de memoria ram, puede ser mucho más grande.Consulte este documento: vmlinuz Definición .
fuente
bzImage es el objetivo utilizado para arquitecturas x86 que trabajan con BIOS de PC. Por el contrario, zImage es un objetivo específico de la arquitectura más utilizado para dispositivos integrados y funciona bien con sus cargadores de arranque.
fuente