Aşağıdaki çekirdek Makefile terimleri arasındaki fark nedir: vmLinux, vmlinuz, vmlinux.bin, zimage & bzimage?


50

Çekirdek Marka Dosyaları arasında gezinirken, bu şartları buldum. Bu yüzden arasındaki fark nedir bilmek istiyorum vmlinux, vmlinuz, vmlinux.bin, zimageve bzimage?


Ben zimage gz sıkıştırma ve bzimage bz sıkıştırma olduğunu düşünüyorum bence ... jut adlandırma, hiçbiri lanet bir şey anlamına gelir. ama yanılıyor olabilirim.
xenoterracide

Ayrıca vmlinuz.efiUbuntu 14.04'te
Ciro Santilli,

Yanıtlar:


59

vmlinux

Bu, Linux çekirdeği statik olarak bağlı bir yürütülebilir dosya biçimindedir. Genel olarak, bu dosya için endişelenmenize gerek yoktur, bu önyükleme prosedüründe sadece orta bir adımdır.

Ham vmlinux dosyası hata ayıklama amaçları için yararlı olabilir.

vmlinux.bin

Vmlinux ile aynı, ancak önyüklenebilir bir ham ikili dosya biçiminde. Tüm semboller ve yer değiştirme bilgileri atılır. Elde Edilen vmlinuxtarafından objcopy -O binary vmlinux vmlinux.bin.

vmlinuz

Vmlinux dosyası genellikle ile sıkıştırılır zlib. 2.6.30'dan beri LZMAve bzip2ayrıca mevcuttur. Vmlinuz'a daha fazla önyükleme ve açma yeteneği ekleyerek, görüntü, vmlinux çekirdeği ile bir sistemi önyüklemek için kullanılabilir. Vmlinux sıkıştırması, zImage veya bzImage ile oluşabilir.

İşlev decompress_kernel(), açılışta vmlinuz'un sıkıştırmasını işler, bir mesaj şunu belirtir:

Decompressing Linux... done
Booting the kernel.

zImage ( make zImage)

Bu, küçük çekirdeğin eski biçimidir (sıkıştırılmış, 512KB'nin altında). Önyükleme sırasında, bu görüntü belleğe az yüklenir (RAM'in ilk 640 KB'si).

bzImage ( make bzImage)

Büyük zImage (bununla ilgisi yok bzip2), çekirdek büyürken ve daha büyük görüntüler işlerken (sıkıştırılmış, 512KB üzerinde) oluşturuldu. Görüntü hafızada yüksek yüklenir (1 MB RAM'in üzerinde). Bugünün çekirdekleri 512KB'nin üzerinde olduğu için, bu genellikle tercih edilen yoldur.


Ubuntu 10.10'da yapılan bir inceleme şunları gösteriyor:

ls -lh /boot/vmlinuz-$(uname -r)
-rw-r--r-- 1 root root 4.1M 2010-11-24 12:21 /boot/vmlinuz-2.6.35-23-generic

file /boot/vmlinuz-$(uname -r)
/boot/vmlinuz-2.6.35-23-generic: Linux kernel x86 boot executable bzImage, version 2.6.35-23-generic (buildd@rosea, RO-rootFS, root_dev 0x6801, swap_dev 0x4, Normal VGA

Bu decompress_kernel () işlevi uygulaması nerede bulunur?
Sen

2
Bu yer alır /arch/$ARCH/boot/compressed/misc.c, buraya bakın: lxr.linux.no/#linux+v2.6.37/arch/x86/boot/compressed/...
şakacı

8

Ayrıntılı bir çekirdek yap ve dosyaları ara

Bu yaklaşım bazı bilgiler verebilir, asla eskimez ve asla yapı sisteminin hangi bölümünün ne yaptığını kolayca bulmanıza yardımcı olur.

Dosyalardan birini üreten bir yapı yapılandırmasına sahip olduktan sonra, ile derleyin:

make V=1 |& tee f.log

Daha önce oluşturduysanız, yeniden link vermek için (örneğin init/main.c, iyi bir oyundur) bazı C dosyalarındaki yorumları değiştirin .

Şimdi, f.logilgilendiğiniz görüntüleri inceleyin ve arayın.

Örneğin, v4.19'da şu sonucu çıkartacağız:

init/main.c
|
| gcc -c
|
v
init/.tmp_main.o
|
| CONFIG_MODVERSIONS stuff
|
v
init/main.o
|
| ar T (thin archive)
|
v
init/built-in.a
|
| ar T (thin archive)
|
v
built-in.a
|
| ld
|
v
vmlinux (regular ELF file)
|
| objcopy
|
v
arch/x86/boot/compressed/vmlinux.bin
|
| GZIP
|
v
arch/x86/boot/compressed/vmlinux.bin.gz
|
| .incbin
|
v
arch/x86/boot/compressed/piggy.S
|
| gcc -c
|
v
arch/x86/boot/compressed/piggy.o
|
| ld
|
v
arch/x86/boot/compressed/vmlinux (regular ELF file with gzipped code)
|
| objcopy
|
v
arch/x86/boot/vmlinux.bin
|
| arch/x86/boot/tools/build.c
|
v
arch/x86/boot/bzImage

İnce arşivlerde şu adresten bahsedilir: https://stackoverflow.com/questions/2157629/linking-static-libraries-to-other-static-libraries/27676016#27676016 Kopyalamak yerine sadece diğer arşiv / nesneleri işaret eden arşivlerdir.

Çekirdek, artımlı bağlantıdan v4.9'daki ince arşivlere şu şekilde açıklanmıştır: https://stackoverflow.com/questions/29391965/what-is-partial-linking-in-gnu-linker/53959624#53959624

Tam günlük yorumu

Ayrıntılı derleme günlüklerini yedeklemeden okumaya başladığımızda ilk önce şunu görürüz:

ln -fsn ../../x86/boot/bzImage ./arch/x86_64/boot/bzImage

bu yüzden bu ikisi birbirine bağlandı.

Sonra biraz daha ararız x86/boot/bzImageve buluruz:

arch/x86/boot/tools/build \
arch/x86/boot/setup.bin \
arch/x86/boot/vmlinux.bin \
arch/x86/boot/zoffset.h \
arch/x86/boot/bzImage

arch/x86/boot/tools/build çalıştırılabilir olduğundan, çalıştırıyoruz, yardım iletisine bakın:

Usage: build setup system zoffset.h image

ve kaynağı bulmak için grep:

arch/x86/boot/tools/build.c

Bu araç üretme olmalı Yani arch/x86/boot/bzImagegelen arch/x86/boot/vmlinux.binve diğer dosyalar ne anlamı var Todo buildtam olarak?

Eğer takip arch/x86/boot/vmlinux.binedersek, bunun sadece bir objcopykaynak olduğunu görürüz arch/x86/boot/compressed/vmlinux:

objcopy \
-O binary \
-R .note \
-R .comment \
-S arch/x86/boot/compressed/vmlinux \
arch/x86/boot/vmlinux.bin

ve arch/x86/boot/compressed/vmlinuxsadece normal bir ELF dosyasıdır:

ld \
-m elf_x86_64 \
-z noreloc-overflow \
-pie \
--no-dynamic-linker \
-T arch/x86/boot/compressed/vmlinux.lds \
arch/x86/boot/compressed/head_64.o \
arch/x86/boot/compressed/misc.o \
arch/x86/boot/compressed/string.o \
arch/x86/boot/compressed/cmdline.o \
arch/x86/boot/compressed/error.o \
arch/x86/boot/compressed/piggy.o \
arch/x86/boot/compressed/cpuflags.o \
arch/x86/boot/compressed/early_serial_console.o \
arch/x86/boot/compressed/kaslr.o \
arch/x86/boot/compressed/kaslr_64.o \
arch/x86/boot/compressed/mem_encrypt.o \
arch/x86/boot/compressed/pgtable_64.o \
-o arch/x86/boot/compressed/vmlinux

ls -hlSrdiyor ki bu piggy.o, şu ana kadarki en büyük dosya, bu yüzden onu aradık ve gelmesi gerekiyor:

gcc \
-Wp,-MD,arch/x86/boot/compressed/.piggy.o.d \
-nostdinc \
-Ilinux/arch/x86/include \
-I./arch/x86/include/generated \
-Ilinux/include \
-I./include \
-Ilinux/arch/x86/include/uapi \
-I./arch/x86/include/generated/uapi \
-Ilinux/include/uapi \
-I./include/generated/uapi \
-include linux/include/linux/kconfig.h \
-D__KERNEL__ \
-m64 \
-O2 \
-fno-strict-aliasing \
-fPIE \
-DDISABLE_BRANCH_PROFILING \
-mcmodel=small \
-mno-mmx \
-mno-sse \
-ffreestanding \
-fno-stack-protector \
-Wno-pointer-sign \
-D__ASSEMBLY__ \
-c \
-o arch/x86/boot/compressed/.tmp_piggy.o \
arch/x86/boot/compressed/piggy.S

.tmp_ önek aşağıda açıklanmıştır.

arch/x86/boot/compressed/piggy.S içerir:

.incbin "arch/x86/boot/compressed/vmlinux.bin.gz"

ayrıca bakınız: https://stackoverflow.com/questions/4158900/embedding-resources-in-executable-using-gcc/36295692#36295692

arch/x86/boot/compressed/vmlinux.bin.gz gelen:

cat arch/x86/boot/compressed/vmlinux.bin arch/x86/boot/compressed/vmlinux.relocs | \
gzip -n -f -9 > arch/x86/boot/compressed/vmlinux.bin.gz

hangisinden geliyor:

objcopy  -R .comment -S vmlinux arch/x86/boot/compressed/vmlinux.bin

hangisinden geliyor:

LD      vmlinux

hangi yapar:

ld \
-m elf_x86_64 \
-z max-page-size=0x200000 \
--emit-relocs \
--build-id \
-o vmlinux \
-T ./arch/x86/kernel/vmlinux.lds \
--whole-archive \
built-in.a \
--no-whole-archive \
--start-group \
lib/lib.a \
arch/x86/lib/lib.a \
--end-group \
.tmp_kallsyms2.o

vmlinuxçok büyük, ancak gösterilen tüm nesneler küçük boyutlara göre ls -l, bu yüzden arbilmediğim yeni bir özellik hakkında araştırma yaptım ve öğrendim : ince arşivler.

at:

AR      built-in.a

yapı yapar:

ar \
rcsTPD \
built-in.a \
arch/x86/kernel/head_64.o \
arch/x86/kernel/head64.o \
arch/x86/kernel/ebda.o \
arch/x86/kernel/platform-quirks.o \
init/built-in.a \
usr/built-in.a \
arch/x86/built-in.a \
kernel/built-in.a \
certs/built-in.a \
mm/built-in.a \
fs/built-in.a \
ipc/built-in.a \
security/built-in.a \
crypto/built-in.a \
block/built-in.a \
lib/built-in.a \
arch/x86/lib/built-in.a \
drivers/built-in.a \
sound/built-in.a \
firmware/built-in.a \
arch/x86/pci/built-in.a \
arch/x86/power/built-in.a \
arch/x86/video/built-in.a \
net/built-in.a \
virt/built-in.a

T İnce arşivi belirtir.

Daha sonra tüm alt arşivlerin de ince olduğunu görebiliyoruz, örneğin, değiştirdiğimden beri init/main.c:

ar \
rcSTPD \
init/built-in.a \
init/main.o \
init/version.o \
init/do_mounts.o \
init/do_mounts_initrd.o \
init/initramfs.o \
init/calibrate.o \
init/init_task.o

hangi nihayet C dosyasından bir komutla geliyor:

gcc \
-Wp,-MD,init/.main.o.d \
-c \
-o \
init/.tmp_main.o \
/work/linux-kernel-module-cheat/submodules/linux/init/main.c

Bulamıyorum init/.tmp_main.oiçin init/main.obir utanç ile ... olan günlükleri adım:

git grep '\.tmp_'

scripts Makefile.buildOlasılığın, CONFIG_MODVERSIONSbenim etkinleştirdiğimden geldiğini ve bunlarla bağlantılı olduğunu görüyoruz:

ifndef CONFIG_MODVERSIONS
cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<

else
# When module versioning is enabled the following steps are executed:
# o compile a .tmp_<file>.o from <file>.c
# o if .tmp_<file>.o doesn't contain a __ksymtab version, i.e. does
#   not export symbols, we just rename .tmp_<file>.o to <file>.o and
#   are done.
# o otherwise, we calculate symbol versions using the good old
#   genksyms on the preprocessed source and postprocess them in a way
#   that they are usable as a linker script
# o generate <file>.o from .tmp_<file>.o using the linker to
#   replace the unresolved symbols __crc_exported_symbol with
#   the actual value of the checksum generated by genksyms

cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<

cmd_modversions_c =                             \
    if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then     \
        $(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes))  \
            > $(@D)/.tmp_$(@F:.o=.ver);                 \
                                        \
        $(LD) $(KBUILD_LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F)       \
            -T $(@D)/.tmp_$(@F:.o=.ver);                \
        rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver);        \
    else                                    \
        mv -f $(@D)/.tmp_$(@F) $@;                  \
    fi;
endif

İçerdiği bu yapılandırma ile yapılan analiz CONFIG_KERNEL_GZIP=y.

aarch64 arch/arm64/boot/Image

Sadece sıkıştırılmamış objcopydan vmlinux:

objcopy  -O binary -R .note -R .note.gnu.build-id -R .comment -S vmlinux arch/arm64/boot/Image

vmlinux İnce arşivlerde olsa da temelde x86 ile aynı şekilde elde edilir.

arch/arm/boot/zImage

Fermuarlı X86'ya çok benzer vmlinux, ancak sihirli bir build.cadım yoktur . Çağrı zinciri özeti:

objcopy -O binary -R .comment -S  arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage

ld \
-EL \
--defsym _kernel_bss_size=469592 \
-p \
--no-undefined \
-X \
-T arch/arm/boot/compressed/vmlinux.lds \
arch/arm/boot/compressed/head.o \
arch/arm/boot/compressed/piggy.o \
arch/arm/boot/compressed/misc.o \
arch/arm/boot/compressed/decompress.o \
arch/arm/boot/compressed/string.o \
arch/arm/boot/compressed/hyp-stub.o \
arch/arm/boot/compressed/lib1funcs.o \
arch/arm/boot/compressed/ashldi3.o \
arch/arm/boot/compressed/bswapsdi2.o \
-o arch/arm/boot/compressed/vmlinux

gcc \
-c \
-o arch/arm/boot/compressed/piggy.o \
linux/arch/arm/boot/compressed/piggy.S

.incbin "arch/arm/boot/compressed/piggy_data"

cat arch/arm/boot/compressed/../Image | gzip -n -f -9 > arch/arm/boot/compressed/piggy_data

objcopy -O binary -R .comment -S  vmlinux arch/arm/boot/Image

QEMU v4.0.0, bzImage'dan önyüklenebilir, ancak vmlinux'ü önyükleyebilir

Bu da önemli bir pratik farktır: https://superuser.com/questions/1451568/booting-an-uncompressed-kernel-in-qemu



1

vmlinux :

Sıkıştırılmamış ve önyüklenebilir olmayan bir Linux çekirdek dosya formatı, yalnızca üretime yönelik bir adım vmlinuz.

vmlinuz :
Sıkıştırılmış ve önyüklenebilir bir Linux çekirdek dosyası. Aslında zImageya da bzImagedosya.

zImage :
Eski çekirdekler için, sadece 640kkoç boyuna uyun .

bzImage :, koç boyutu sınırı
Big zImageyoktur 640k, çok daha büyük olabilir.

Lütfen bu belgeye bakın: vmlinuz Definition .


1

bzImage , PC BIOS ile çalışan x86 mimarileri için kullanılan hedeftir. Buna karşılık, zImage , gömülü aygıtlar için en sık kullanılan mimariye özgü bir hedeftir ve önyükleyicileriyle iyi çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.