Просматривая файлы ядра Kernel, я нашел эти термины. Так что я хотел бы знать , в чем разница между vmlinux
, vmlinuz
, vmlinux.bin
, zimage
& bzimage
?
50
Просматривая файлы ядра Kernel, я нашел эти термины. Так что я хотел бы знать , в чем разница между vmlinux
, vmlinuz
, vmlinux.bin
, zimage
& bzimage
?
vmlinuz.efi
используется в Ubuntu 14.04: askubuntu.com/questions/330541/what-is-vmlinuz-efiОтветы:
vmlinux
Это ядро Linux в статически связанном формате исполняемого файла. Как правило, вам не нужно беспокоиться об этом файле, это всего лишь промежуточный этап процедуры загрузки.
Необработанный файл vmlinux может быть полезен для целей отладки.
vmlinux.bin
То же, что и vmlinux, но в формате загрузочного двоичного файла. Все символы и информация о перемещении отбрасываются. Сформировано из
vmlinux
путиobjcopy -O binary vmlinux vmlinux.bin
.vmlinuz
Файл vmlinux обычно сжимается
zlib
. С 2.6.30LZMA
иbzip2
также доступны. Добавив дополнительные возможности загрузки и распаковки в vmlinuz, образ можно использовать для загрузки системы с ядром vmlinux. Сжатие vmlinux может происходить с zImage или bzImage.Функция
decompress_kernel()
обрабатывает распаковку vmlinuz при загрузке, сообщение указывает это:zImage (
make zImage
)Это старый формат для небольших ядер (сжатый, ниже 512 КБ). При загрузке этот образ загружается с небольшим объемом памяти (первые 640 КБ ОЗУ).
bzImage (
make bzImage
)Большой zImage (это не имеет ничего общего
bzip2
) был создан в то время как ядро росло и обрабатывает большие изображения (сжатые, более 512 КБ). Изображение загружается высоко в памяти (более 1 МБ ОЗУ). Поскольку сегодняшние ядра имеют размер более 512 КБ, это обычно предпочтительный способ.Проверка Ubuntu 10.10 показывает:
источник
/arch/$ARCH/boot/compressed/misc.c
, смотрите здесь: lxr.linux.no/#linux+v2.6.37/arch/x86/boot/compressed/...Сделайте подробное построение ядра и ищите файлы
Этот подход может дать некоторое представление, никогда не устареет и поможет вам легко определить, какая часть системы сборки делает что.
Если у вас есть конфигурация сборки, которая генерирует один из файлов, выполните сборку с помощью:
Измените комментарий к некоторому C-файлу, чтобы вызвать повторную ссылку (например,
init/main.c
хорошую), если вы уже создали ранее.Теперь осмотрите
f.log
и найдите интересующие изображения.Например, на v4.19 мы заключим, что:
Тонкие архивы упоминаются по адресу: https://stackoverflow.com/questions/2157629/linking-static-libraries-to-other-static-libraries/27676016#27676016 Это архивы, которые просто указывают на другие архивы / объекты, а не копируют их.
Ядро перешло от инкрементных ссылок к тонким архивам в v4.9, как описано по адресу: https://stackoverflow.com/questions/29391965/what-is-partial-linking-in-gnu-linker/53959624#53959624
Полная интерпретация журнала
Когда мы начинаем читать подробные журналы сборки из резервной копии, сначала мы видим:
так что эти двое просто символические.
Затем мы ищем немного дальше
x86/boot/bzImage
и находим:arch/x86/boot/tools/build
это исполняемый файл, поэтому мы запускаем его, смотрите сообщение справки:и grep, чтобы найти источник:
Таким образом, этот инструмент должен генерировать
arch/x86/boot/bzImage
изarch/x86/boot/vmlinux.bin
и других файлов TODO какой смыслbuild
именно?Если мы следуем,
arch/x86/boot/vmlinux.bin
мы видим, что это простоobjcopy
отarch/x86/boot/compressed/vmlinux
:и
arch/x86/boot/compressed/vmlinux
это просто обычный файл ELF:ls -hlSr
говорит, чтоpiggy.o
это самый большой файл, поэтому мы ищем его, и он должен быть получен из:.tmp_
префикс поясняется ниже.arch/x86/boot/compressed/piggy.S
содержит:см. также: https://stackoverflow.com/questions/4158900/embedding-resources-in-executable-using-gcc/36295692#36295692
arch/x86/boot/compressed/vmlinux.bin.gz
происходит от:который исходит из:
который исходит из:
который делает:
vmlinux
Огромный, но все показанные объекты являются крошечнымиls -l
, поэтому я исследовал и узнал о новойar
функции, о которой я не знал: тонкие архивы.В:
сборка делает:
T
указывает тонкий архив.Затем мы можем видеть, что все подархивы также тонкие, например, так как я изменил
init/main.c
, мы имеем:который в итоге приходит из файла C с помощью команды вроде:
Я не могу найти
init/.tmp_main.o
кinit/main.o
шагу на бревнах , который является позором ... с:мы видим, что это, скорее всего, исходит
scripts Makefile.build
и связано с тем,CONFIG_MODVERSIONS
что я включил:Анализ сделан с этим конфигом, который содержит
CONFIG_KERNEL_GZIP=y
.aarch64
arch/arm64/boot/Image
Просто несжатый
objcopy
изvmlinux
:vmlinux
получается в основном точно так же, как и для x86 через тонкие архивы.arch/arm/boot/zImage
Очень похоже на X86 с молнией
vmlinux
, но без магическогоbuild.c
шага. Сводка цепочки вызовов:QEMU v4.0.0 может загружаться с bzImage, но не с vmlinux
Это еще одно важное практическое отличие: https://superuser.com/questions/1451568/booting-an-uncompressed-kernel-in-qemu
источник
Это все здесь: http://en.wikipedia.org/wiki/Vmlinux
источник
vmlinux :
Несжатый и не загружаемый формат файла ядра Linux, просто промежуточный шаг к созданию
vmlinuz
.vmlinuz :
сжатый и загрузочный файл ядра Linux. Это на самом деле
zImage
илиbzImage
файл.zImage :
Для старых ядер просто подгоните
640k
размер оперативной памяти .bzImage :,
Big zImage
без640k
ограничения размера оперативной памяти , может гораздо больше.Пожалуйста, обратитесь этот документ: vmlinuz Определение .
источник
bzImage - цель, используемая для архитектур x86, работающих с BIOS компьютера. Напротив, zImage - это специфичная для архитектуры цель, наиболее часто используемая для встраиваемых устройств и хорошо работающая с их загрузчиками.
источник