Saat browsing melalui Kernel Makefiles, saya menemukan istilah-istilah ini. Jadi saya ingin tahu apa perbedaan antara vmlinux
, vmlinuz
, vmlinux.bin
, zimage
& bzimage
?
linux
kernel
file-format
Sen
sumber
sumber
vmlinuz.efi
digunakan pada Ubuntu 14.04: askubuntu.com/questions/330541/what-is-vmlinuz-efiJawaban:
vmlinux
Ini adalah kernel Linux dalam format file yang dapat dieksekusi yang terhubung secara statis. Secara umum, Anda tidak perlu khawatir tentang file ini, itu hanya langkah menengah dalam prosedur boot.
File raw vmlinux mungkin berguna untuk keperluan debugging.
vmlinux.bin
Sama seperti vmlinux, tetapi dalam format file biner mentah yang dapat di-boot. Semua simbol dan informasi relokasi dibuang. Dihasilkan dari
vmlinux
olehobjcopy -O binary vmlinux vmlinux.bin
.vmlinuz
File vmlinux biasanya dikompresi
zlib
. Sejak 2.6.30LZMA
danbzip2
juga tersedia. Dengan menambahkan kemampuan boot dan dekompresi lebih lanjut ke vmlinuz, gambar dapat digunakan untuk mem-boot sistem dengan kernel vmlinux. Kompresi vmlinux dapat terjadi dengan zImage atau bzImage.Fungsi ini
decompress_kernel()
menangani dekompresi vmlinuz saat bootup, sebuah pesan mengindikasikan ini:zGambar (
make zImage
)Ini adalah format lama untuk kernel kecil (terkompresi, di bawah 512KB). Saat boot, gambar ini dimuat dalam memori rendah (RAM 640KB pertama).
bzImage (
make bzImage
)ZImage besar (ini tidak ada hubungannya dengan
bzip2
), diciptakan ketika kernel tumbuh dan menangani gambar yang lebih besar (terkompresi, lebih dari 512KB). Gambar dimuat dalam memori tinggi (di atas 1MB RAM). Karena kernel saat ini adalah lebih dari 512KB, ini biasanya cara yang disukai.Inspeksi pada Ubuntu 10.10 menunjukkan:
sumber
/arch/$ARCH/boot/compressed/misc.c
, lihat di sini: lxr.linux.no/#linux+v2.6.37/arch/x86/boot/compressed/...Lakukan pembuatan kernel verbose dan cari file
Pendekatan ini dapat memberikan beberapa wawasan, tidak akan pernah ketinggalan zaman, dan akan membantu Anda untuk dengan mudah menemukan bagian mana dari sistem build yang melakukan apa.
Setelah Anda memiliki konfigurasi build yang menghasilkan salah satu file, build with:
Ubah komentar pada beberapa file C untuk memaksa tautan ulang (mis. Yang
init/main.c
bagus) jika Anda sudah membangun sebelumnya.Sekarang, periksa
f.log
dan cari gambar yang menarik.Sebagai contoh, pada v4.19 kita akan menyimpulkan bahwa:
Arsip tipis disebutkan di: https://stackoverflow.com/questions/2157629/linking-static-libraries-to-other-static-libraries/27676016#27676016 Ini adalah arsip yang hanya menunjuk arsip / objek lain alih-alih menyalinnya.
Kernel bergerak dari penautan bertahap ke arsip tipis di v4.9 seperti dijelaskan di: https://stackoverflow.com/questions/29391965/what-is-partial-linking-in-gnu-linker/53959624#53959624
Interpretasi log lengkap
Ketika kita mulai membaca log build verbose dari belakang, pertama-tama kita melihat:
jadi keduanya hanya disinkronkan.
Kemudian kami mencari sedikit lebih jauh
x86/boot/bzImage
dan menemukan:arch/x86/boot/tools/build
dapat dieksekusi, jadi kami jalankan, lihat pesan bantuan:dan grep untuk menemukan sumbernya:
Jadi alat ini harus menghasilkan
arch/x86/boot/bzImage
dariarch/x86/boot/vmlinux.bin
dan file-file lain TODO apa gunanyabuild
sebenarnya?Jika kita mengikuti,
arch/x86/boot/vmlinux.bin
kita melihat bahwa itu hanyaobjcopy
dariarch/x86/boot/compressed/vmlinux
:dan
arch/x86/boot/compressed/vmlinux
ini hanya file ELF biasa:ls -hlSr
mengatakan itupiggy.o
adalah file terbesar, jadi kami mencarinya, dan itu harus berasal dari:.tmp_
awalan dijelaskan di bawah ini.arch/x86/boot/compressed/piggy.S
mengandung:lihat juga: https://stackoverflow.com/questions/4158900/embedding-resources-in-executable-using-gcc/36295692#36295692
arch/x86/boot/compressed/vmlinux.bin.gz
datang dari:yang berasal dari:
yang berasal dari:
yang tidak:
vmlinux
memang besar, tetapi semua objek yang ditampilkan kecil menurutls -l
, jadi saya meneliti dan mempelajariar
fitur baru yang tidak saya ketahui: arsip tipis.Di:
build tidak:
T
menentukan arsip tipis.Kita kemudian dapat melihat bahwa semua sub arsip juga tipis, misalnya, karena saya modifikasi
init/main.c
, kami memiliki:yang akhirnya berasal dari file C melalui perintah seperti:
Saya tidak dapat menemukan
init/.tmp_main.o
untukinit/main.o
menginjak log yang memalukan ... dengan:kami melihat bahwa kemungkinan berasal dari
scripts Makefile.build
dan terhubung denganCONFIG_MODVERSIONS
yang telah saya aktifkan:Analisis dilakukan dengan konfigurasi ini yang berisi
CONFIG_KERNEL_GZIP=y
.aarch64
arch/arm64/boot/Image
Hanya yang tidak dikompresi
objcopy
darivmlinux
:vmlinux
diperoleh pada dasarnya dengan cara yang sama persis seperti untuk x86 meskipun arsip tipis.arch/arm/boot/zImage
Sangat mirip dengan X86 dengan zip
vmlinux
, tetapi tidak adabuild.c
langkah ajaib . Ringkasan rantai panggilan:QEMU v4.0.0 dapat melakukan boot dari bzImage tetapi tidak vmlinux
Ini adalah perbedaan praktis penting lainnya: https://superuser.com/questions/1451568/booting-an-uncompressed-kernel-in-qemu
sumber
Semuanya ada di sini: http://en.wikipedia.org/wiki/Vmlinux
sumber
vmlinux :
Format file kernel Linux non-terkompresi dan non-boot, hanya langkah menengah untuk memproduksi
vmlinuz
.vmlinuz :
File kernel Linux yang terkompresi dan dapat di-boot. Sebenarnya
zImage
ataubzImage
file.zImage :
Untuk kernel lama, pas
640k
ukuran ram.bzImage :
Big zImage
, tidak ada640k
ram batas ukuran, banyak yang dapat lebih besar.Silakan merujuk dokumen ini: Definisi vmlinuz .
sumber
bzImage adalah target yang digunakan untuk arsitektur x86 yang bekerja dengan PC BIOS. Sebaliknya, zImage adalah target spesifik arsitektur yang paling umum digunakan untuk perangkat tertanam dan bekerja dengan baik dengan bootloader mereka.
sumber