Яка різниця між такими термінами Makefile для ядра: vmLinux, vmlinuz, vmlinux.bin, zimage & bzimage?


50

Під час перегляду файлів Kernel Makefiles я знайшов ці терміни. Так що я хотів би знати , в чому різниця між vmlinux, vmlinuz, vmlinux.bin, zimage& bzimage?


Невеликий розмір Я думаю, що zimage - це стиснення gz, а bzimage - стиснення bz ... іменування джетів, афаік нічого з цього не означає прокляту річ. але я можу помилитися.
ксенотеррацид

Також vmlinuz.efiвикористовується на Ubuntu 14.04: askubuntu.com/questions/330541/what-is-vmlinuz-efi
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Відповіді:


59

vmlinux

Це ядро ​​Linux у форматі стаціонарно пов'язаного виконуваного файлу. Як правило, вам не потрібно турбуватися про цей файл, це лише проміжний крок у процедурі завантаження.

Сирий файл vmlinux може бути корисним для налагодження.

vmlinux.bin

Те саме, що vmlinux, але у форматі завантажуваного необробленого бінарного файлу. Усі символи та інформація про переселення відкидаються. Сформовано з vmlinuxшляху objcopy -O binary vmlinux vmlinux.bin.

vmlinuz

Файл vmlinux зазвичай стискається zlib. З 2.6.30 LZMAі bzip2також доступні. Додавши додаткові можливості завантаження та декомпресії до vmlinuz, зображення можна використовувати для завантаження системи з ядром vmlinux. Стиснення vmlinux може відбуватися за допомогою zImage або bzImage.

Функція decompress_kernel()обробляє декомпресію vmlinuz при завантаженні, повідомлення вказує на це:

Decompressing Linux... done
Booting the kernel.

zImage ( make zImage)

Це старий формат для невеликих ядер (стислий, нижче 512 КБ). Під час завантаження це зображення завантажується в пам'яті (перші 640 КБ оперативної пам’яті).

bzImage ( make bzImage)

Великий zImage (це не має нічого спільного bzip2) був створений, коли ядро ​​росло та обробляє більші зображення (стиснені, понад 512 КБ). Зображення завантажується з високою пам'яттю (вище 1 Мб оперативної пам’яті). Оскільки сьогоднішні ядра значно перевищують 512 КБ, зазвичай це є кращим способом.


Інспекція Ubuntu 10.10 показує:

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

Де розміщена ця реалізація функції decompress_kernel () ?
Вересень

2
Він розташований на /arch/$ARCH/boot/compressed/misc.c, дивіться тут: lxr.linux.no/#linux+v2.6.37/arch/x86/boot/compressed / ...
помах

8

Зробіть багатослівне ядро ​​та шукайте файли

Такий підхід може дати деяке розуміння, ніколи не застаріє і допоможе вам легко знайти, яка частина системи збирання робить що.

Коли у вас є конфігурація збірки, яка генерує один з файлів, побудуйте за допомогою:

make V=1 |& tee f.log

Змініть коментар до якогось файлу C, щоб вимусити повторне посилання (наприклад init/main.c, хороший), якщо ви вже створили попередньо.

Тепер огляньте f.logта знайдіть цікаві образи.

Наприклад, на v4.19 зробимо висновок, що:

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

Тонкі архіви згадуються за адресою: https://stackoverflow.com/questions/2157629/linking-static-libraries-to-other-static-libraries/27676016#27676016 Це архіви, які просто вказують на інші архіви / об’єкти, а не копіюють їх.

Ядро перейшло від інкрементального посилання на тонкі архіви в версії 4.9, як описано на веб- сайті: https://stackoverflow.com/questions/29391965/what-is-partial-linking-in-gnu-linker/53959624#53959624

Повна інтерпретація журналу

Коли ми починаємо читати журнали вербальної збірки із резервної копії, спочатку ми бачимо:

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

тож ці двоє просто пов'язані між собою.

Потім ми шукаємо трохи далі x86/boot/bzImageі знаходимо:

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 є виконуваним файлом, тому ми запускаємо його, дивіться довідкове повідомлення:

Usage: build setup system zoffset.h image

і grep щоб знайти джерело:

arch/x86/boot/tools/build.c

Отже, цей інструмент повинен генерувати arch/x86/boot/bzImageз arch/x86/boot/vmlinux.binта інших файлів TODO, в чому саме полягає справа build?

Якщо ми слідуємо, arch/x86/boot/vmlinux.binми бачимо, що це просто objcopyз arch/x86/boot/compressed/vmlinux:

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

і arch/x86/boot/compressed/vmlinuxце лише звичайний файл ELF:

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каже, що piggy.oце далеко не найбільший файл, тому ми його шукаємо, і він повинен виходити з:

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_ префікс пояснено нижче.

arch/x86/boot/compressed/piggy.S містить:

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

дивіться також: https://stackoverflow.com/questions/4158900/embedding-resources-in-executable-using-gcc/36295692#36295692

arch/x86/boot/compressed/vmlinux.bin.gz походить від:

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

що походить від:

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

що походить від:

LD      vmlinux

що робить:

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є величезним, але всі показані об’єкти крихітні відповідно ls -l, тому я дослідив та дізнався про нову arособливість, про яку я не знав: тонкі архіви.

На:

AR      built-in.a

збірка робить:

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 вказує тонкий архів.

Потім ми можемо побачити, що всі під архіви також тонкі, наприклад, коли я змінив 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

який нарешті походить з файлу С за допомогою команди типу:

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

Я не можу знайти init/.tmp_main.oдо init/main.oкроку на колодах , який є ганьбою ... з:

git grep '\.tmp_'

ми бачимо, що це, ймовірно, походить scripts Makefile.buildі пов'язане з тим, CONFIG_MODVERSIONSщо я ввімкнув:

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

Аналіз, виконаний за допомогою цього конфігурації, який містить CONFIG_KERNEL_GZIP=y.

aarch64 arch/arm64/boot/Image

Тільки не стиснений objcopyз vmlinux:

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

vmlinux отримується в основному точно так само, як для x86, хоча тонкі архіви.

arch/arm/boot/zImage

Дуже схожий на X86 з блискавкою vmlinux, але не магічним build.cкроком. Підсумок ланцюжка викликів:

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, але не з vmlinux

Це ще одна важлива практична відмінність: https://superuser.com/questions/1451568/booting-an-uncompression-kernel-in-qemu



1

vmlinux :

Формат файлу ядра Linux, що не стискається і не завантажується, лише проміжний крок до створення vmlinuz.

vmlinuz :
стислий і завантажуваний файл ядра Linux. Це насправді zImageабо bzImageфайл.

zImage :
Для старих ядер просто підходить 640kрозмір барана.

bzImage : обмеження розміру барана
Big zImageне 640kможе бути значно більшим.

Будь ласка, зверніться до цього документа: vmlinuz Визначення .


1

bzImage - ціль, яка використовується для архітектур x86, що працюють з комп'ютерними BIOS. На відміну від цього, zImage - це цільова архітектура, яка найчастіше використовується для вбудованих пристроїв і добре працює з їх завантажувачами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.