Ao navegar pelos Makefiles do Kernel, encontrei estes termos. Então eu gostaria de saber qual é a diferença entre vmlinux
, vmlinuz
, vmlinux.bin
, zimage
e bzimage
?
linux
kernel
file-format
Sen
fonte
fonte
vmlinuz.efi
usado no Ubuntu 14.04: askubuntu.com/questions/330541/what-is-vmlinuz-efiRespostas:
vmlinux
Este é o kernel do Linux em um formato de arquivo executável vinculado estaticamente. Geralmente, você não precisa se preocupar com este arquivo, é apenas uma etapa intermediária no procedimento de inicialização.
O arquivo vmlinux bruto pode ser útil para fins de depuração.
vmlinux.bin
O mesmo que vmlinux, mas em um formato de arquivo binário bruto inicializável. Todos os símbolos e informações de realocação são descartados. Gerado a partir
vmlinux
deobjcopy -O binary vmlinux vmlinux.bin
.vmlinuz
O arquivo vmlinux geralmente é compactado
zlib
. Desde 2.6.30LZMA
ebzip2
também estão disponíveis. Adicionando mais recursos de inicialização e descompactação ao vmlinuz, a imagem pode ser usada para inicializar um sistema com o kernel do vmlinux. A compactação do vmlinux pode ocorrer com zImage ou bzImage.A função
decompress_kernel()
lida com a descompactação do vmlinuz na inicialização, uma mensagem indica o seguinte:zImage (
make zImage
)Este é o formato antigo para kernels pequenos (compactados, abaixo de 512 KB). Na inicialização, essa imagem é carregada com pouca memória (os primeiros 640 KB da RAM).
bzImage (
make bzImage
)O grande zImage (isso não tem nada a ver
bzip2
) foi criado enquanto o kernel cresceu e manipula imagens maiores (compactadas, com mais de 512 KB). A imagem é carregada com muita memória (acima de 1 MB de RAM). Como os kernels de hoje têm mais de 512 KB, essa é geralmente a maneira preferida.Uma inspeção no Ubuntu 10.10 mostra:
fonte
/arch/$ARCH/boot/compressed/misc.c
, veja aqui: lxr.linux.no/#linux+v2.6.37/arch/x86/boot/compressed/…Faça uma compilação detalhada do kernel e procure os arquivos
Essa abordagem pode fornecer algumas informações, nunca ficará desatualizada e ajudará você a encontrar facilmente qual parte do sistema de compilação está fazendo o que.
Depois de ter uma configuração de construção que gera um dos arquivos, construa com:
Modifique um comentário em algum arquivo C para forçar um re-link (por exemplo,
init/main.c
é um bom) se você já tiver construído anteriormente.Agora, inspecione
f.log
e procure as imagens de interesse.Por exemplo, na v4.19, concluiremos que:
Os arquivos compactados são mencionados em: https://stackoverflow.com/questions/2157629/linking-static-libraries-to-other-static-libraries/27676016#27676016 São arquivos que apenas apontam outros arquivos / objetos em vez de copiá-los.
O kernel passou da vinculação incremental para os arquivos compactados na v4.9, conforme descrito em: https://stackoverflow.com/questions/29391965/what-is-partial-linking-in-gnu-linker/53959624#53959624
Interpretação completa do log
Quando começamos a ler os logs de construção detalhados a partir do backup, primeiro vemos:
então esses dois são apenas simbolizados.
Em seguida, procuramos um pouco mais
x86/boot/bzImage
e descobrimos:arch/x86/boot/tools/build
é um executável, por isso, como rodamos, veja a mensagem de ajuda:e grep para encontrar a fonte:
Portanto, esta ferramenta deve gerar a
arch/x86/boot/bzImage
partir dearch/x86/boot/vmlinux.bin
e outros arquivos TODO, qual é o objetivobuild
exatamente?Se seguirmos
arch/x86/boot/vmlinux.bin
, vemos que é apenas umobjcopy
dearch/x86/boot/compressed/vmlinux
:e
arch/x86/boot/compressed/vmlinux
é apenas um arquivo ELF comum:ls -hlSr
diz que essepiggy.o
é de longe o maior arquivo, então procuramos por ele e deve vir de:.tmp_
prefixo explicado abaixo.arch/x86/boot/compressed/piggy.S
contém:consulte também: https://stackoverflow.com/questions/4158900/embedding-resources-in-executable-using-gcc/36295692#36295692
arch/x86/boot/compressed/vmlinux.bin.gz
vem de:que vem de:
que vem de:
que faz:
vmlinux
é enorme, mas todos os objetos mostrados são pequenos de acordo comls -l
, então pesquisei e aprendi sobre um novoar
recurso que não conhecia: arquivos finos.Em:
a compilação faz:
T
especifica o arquivo morto fino.Podemos então ver que todos os subarquivos também são finos; por exemplo, desde que modifiquei
init/main.c
, temos:que finalmente vem do arquivo C através de um comando como:
Não consigo encontrar o
init/.tmp_main.o
queinit/main.o
pisar os logs que é uma vergonha ... com:vemos que provavelmente vem
scripts Makefile.build
e está vinculado aoCONFIG_MODVERSIONS
qual eu havia habilitado:Análise feita com esta configuração que contém
CONFIG_KERNEL_GZIP=y
.aarch64
arch/arm64/boot/Image
Apenas um descompactado
objcopy
devmlinux
:vmlinux
é obtido basicamente da mesma maneira que no x86 nos arquivos compactados.arch/arm/boot/zImage
Muito semelhante ao X86 com um zipado
vmlinux
, mas nenhumbuild.c
passo mágico . Resumo da cadeia de chamadas:O QEMU v4.0.0 pode inicializar a partir do bzImage, mas não o vmlinux
Essa é outra diferença prática importante: https://superuser.com/questions/1451568/booting-an-uncompressed-kernel-in-qemu
fonte
Está tudo aqui: http://en.wikipedia.org/wiki/Vmlinux
fonte
vmlinux :
Um formato de arquivo do kernel Linux não compactado e não inicializável, apenas uma etapa intermediária da produção
vmlinuz
.vmlinuz :
Um arquivo de kernel Linux compactado e inicializável. É realmente
zImage
oubzImage
arquivo.zImage :
Para kernels antigos, basta ajustar o
640k
tamanho da ram.bzImage :
Big zImage
, sem640k
limite de tamanho de RAM, pode muito maior.Por favor, consulte este documento: vmlinuz Definition .
fonte
bzImage é o destino usado para arquiteturas x86 que trabalham com o BIOS do PC. Por outro lado, o zImage é um destino específico da arquitetura mais comumente usado para dispositivos incorporados e funciona bem com seus gerenciadores de inicialização.
fonte