Çekirdek Marka Dosyaları arasında gezinirken, bu şartları buldum. Bu yüzden arasındaki fark nedir bilmek istiyorum vmlinux
, vmlinuz
, vmlinux.bin
, zimage
ve bzimage
?
vmlinuz.efi
Ubuntu 14.04'te
Çekirdek Marka Dosyaları arasında gezinirken, bu şartları buldum. Bu yüzden arasındaki fark nedir bilmek istiyorum vmlinux
, vmlinuz
, vmlinux.bin
, zimage
ve bzimage
?
vmlinuz.efi
Ubuntu 14.04'te
Yanıtlar:
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 vmlinux
tarafından objcopy -O binary vmlinux vmlinux.bin
.
vmlinuz
Vmlinux dosyası genellikle ile sıkıştırılır zlib
. 2.6.30'dan beri LZMA
ve bzip2
ayrı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
/arch/$ARCH/boot/compressed/misc.c
, buraya bakın: lxr.linux.no/#linux+v2.6.37/arch/x86/boot/compressed/...
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.log
ilgilendiğ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/bzImage
ve 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/bzImage
gelen arch/x86/boot/vmlinux.bin
ve diğer dosyalar ne anlamı var Todo build
tam olarak?
Eğer takip arch/x86/boot/vmlinux.bin
edersek, bunun sadece bir objcopy
kaynak 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/vmlinux
sadece 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 -hlSr
diyor 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 ar
bilmediğ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.o
için init/main.o
bir utanç ile ... olan günlükleri adım:
git grep '\.tmp_'
scripts Makefile.build
Olasılığın, CONFIG_MODVERSIONS
benim 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ış objcopy
dan 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.c
adı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
Hepsi burada: http://en.wikipedia.org/wiki/Vmlinux
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 zImage
ya da bzImage
dosya.
zImage :
Eski çekirdekler için, sadece 640k
koç boyuna uyun .
bzImage :, koç boyutu sınırı
Big zImage
yoktur 640k
, çok daha büyük olabilir.
Lütfen bu belgeye bakın: vmlinuz Definition .
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.