Введение
Исполняемый файл, содержащий ядро Linux, vmlinux — это статически скомпонованный исполняемый файл, содержащий ядро Linux в одном из поддерживаемых Linux форматов объектных файлов, таких как исполняемый и компонуемый формат (ELF) и общий объектный формат (COFF). Файл vmlinux может потребоваться для отладки ядра, генерации таблицы символов или других операций, но для использования в качестве ядра операционной системы его необходимо сделать загрузочным, добавив многозагрузочный заголовок, загрузочный сектор и процедуры инициализации.
vmlinux is a statically linked executable file that contains the Linux kernel in one of the object file formats supported by Linux, which includes Executable and Linkable Format (ELF) and Common Object File Format (COFF). The vmlinux file might be required for kernel debugging, symbol table generation or other operations, but must be made bootable before being used as an operating system kernel by adding a multiboot header, bootsector and setup routines.
Этимология
Традиционно на платформах UNIX образ ядра назывался /unix. С развитием виртуальной памяти ядрам, поддерживающим эту функцию, стали присваивать префикс vm для их различения. Имя vmlinux является производным от vmunix, а буква z в конце vmlinuz указывает на то, что он сжат (например, с помощью gzip).
Местоположение
Традиционно ядро располагалось в корневом каталоге иерархии файловой системы; однако, поскольку загрузчик должен использовать драйверы BIOS для доступа к жесткому диску, ограничения на некоторых системах i386 означали, что адресовалось только первые 1024 цилиндров жесткого диска. Чтобы обойти это ограничение, дистрибутивы Linux рекомендовали пользователям создавать раздел в начале диска специально для хранения файлов, связанных с загрузчиком и ядром. GRUB, LILO и SYSLINUX — распространенные загрузчики. По соглашению, этот раздел монтируется в иерархии файловой системы как /boot. Это впоследствии было стандартизировано стандартом иерархии файловой системы (FHS), который теперь требует, чтобы образ ядра Linux находился либо в /, либо в /boot, хотя технически это требование не является обязательным.
Сжатие
Традиционно, при создании загрузочного образа ядра, само ядро также сжимается с помощью gzip или, начиная с Linux 2.6.30, с помощью LZMA или bzip2, что требует включения в результирующий образ небольшого модуля распаковки. Этот модуль распаковывает код ядра, на некоторых системах выводя точки на консоль для индикации прогресса, а затем продолжает процесс загрузки. Поддержка сжатия LZO, xz, LZ4 и zstd была добавлена позднее. Время, затрачиваемое на распаковку, незначительно влияет на время загрузки, и до разработки формата bzImage ограничения по размеру некоторых архитектур, особенно i386, были очень строгими, что делало сжатие необходимым. На архитектуре SPARC файл vmlinux сжимается простым gzip, поскольку загрузчик SILO прозрачно распаковывает gzip-архивы. Имя файла загрузочного образа не имеет значения, но многие популярные дистрибутивы используют vmlinuz.
bzИзображение
По мере развития ядра Linux размер ядер, создаваемых пользователями, превысил ограничения, накладываемые некоторыми архитектурами, где объём доступной памяти для хранения сжатого кода ядра ограничен. Формат bzImage (большой zImage) был разработан для преодоления этого ограничения путём разделения ядра на несмежные области памяти. bzImage сжимался с помощью gzip до версии Linux 2.6.30, файл piggy.o содержит сжатый gzip-ом файл vmlinux в своём разделе данных. Скрипт extract-vmlinux, расположенный в каталоге scripts/ в исходном коде ядра, распаковывает образ ядра. Некоторые дистрибутивы (например, Red Hat и их производные) могут поставляться с пакетом RPM для отладки ядра, содержащим файл vmlinux для соответствующего пакета ядра, который обычно устанавливается в /usr/lib/debug/lib/modules/`uname -r`/vmlinux или /usr/lib/debug/lib64/modules/`uname -r`/vmlinux.