vmlinux
On Linux systems, vmlinux
is a statically linked executable file that contains the Linux kernel in one of the object file formats supported by Linux, which includes ELF, COFF and a.out. 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.
Etymology
Traditionally, UNIX platforms called the kernel image /unix
. With the development of virtual memory, kernels that supported this feature were given the vm-
prefix to differentiate them. The name vmlinux
is a mutation of vmunix, while in vmlinuz
the letter z
at the end denotes that it is compressed (for example gzipped).[1]
Location
Traditionally, the kernel was located in the root directory of the filesystem hierarchy; however, as the bootloader must use BIOS drivers to access the hard disk, limitations on some i386 systems meant only the first 1024 cylinders of the hard disk were addressable.
To overcome this, Linux distributors encouraged users to create a partition at the beginning of their drives specifically for storing bootloader and kernel related files. GRUB, LILO and SYSLINUX are common bootloaders.
By convention, this partition is mounted on the filesystem hierarchy as /boot
. This was later standardised by the Filesystem Hierarchy Standard (FHS) which now requires the Linux kernel image to be located in either /
or /boot
, although there is no technical restriction enforcing this.[2]
Compression
Traditionally, when creating a bootable kernel image, the kernel is also compressed using gzip, or since Linux 2.6.30,[3] using LZMA or bzip2, which requires a very small decompression stub to be included in the resulting image. The stub decompresses the kernel code, on some systems printing dots to the console to indicate progress, and then continues the boot process. Support for LZO and LZ4 compression was later added.[4]
The decompression routine is a negligible factor in boot time, and prior to the development of the bzImage, the size constraints of some architectures, notably i386, were extremely limiting, making compression a necessity.
On the SPARC architecture, the vmlinux file is compressed using simple gzip, because the SILO boot loader transparently decompresses gzipped images.
The filename of the bootable image is not important, but many popular distributions use vmlinuz.
bzImage
As the Linux kernel matured, the size of the kernels generated by users grew beyond the limits imposed by some architectures, where the space available to store the compressed kernel code is limited.
The bzImage (big zImage) format was developed to overcome this limitation by splitting the kernel over discontiguous memory regions.
The bzImage was compressed using gzip until Linux 2.6.30[3] which introduced more algorithms. Although there is the popular misconception that the bz
prefix means that bzip2 compression is used (the bzip2 package is often distributed with tools prefixed with bz
, such as bzless
, bzcat
, etc.), this is not the case.
The bzImage file is in a specific format. It contains concatenated bootsect.o
+ setup.o
+ misc.o
+ piggy.o
.[5]
piggy.o
contains the gzipped vmlinux file in its data section (ELF) (see compressed/Makefile piggy.o). All source files mentioned are in arch/i386/boot/
.
The script extract-vmlinux
found under scripts/
in the kernel sources decompresses a kernel image. Some distributions (e.g. Red Hat and clones) may come with a kernel-debuginfo
RPM that contains the vmlinux
file for the matching kernel RPM, and it typically gets installed under /usr/lib/debug/lib/modules/`uname -r`/vmlinux
or /usr/lib/debug/lib64/modules/`uname -r`/vmlinux
.
Object format
This is the ELF header from an x86-64 Gentoo 2.6.29 executable kernel image.
$ readelf -h vmlinux
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x1000000
Start of program headers: 64 (bytes into file)
Start of section headers: 13951312 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 5
Size of section headers: 64 (bytes)
Number of section headers: 45
Section header string table index: 42
See also
Notes and references
- ↑ "vmlinuz Definition". www.linfo.org. Bellevue Linux. March 29, 2005. Retrieved 2015-06-21.
- ↑ "Section 3.5.2 — /boot : Static files of the boot loader". FHS 2.3. 2004-01-29. Retrieved 2014-03-11.
The operating system kernel must be located in either / or /boot.
- 1 2 Linux 2.6.30, released the 9th of June 2009, added support to compress the kernel image with the LZMA and bzip2 algorithms
- ↑ https://lkml.org/lkml/2009/9/5/58
- ↑ Yann Droneaud (1999-09-28). "Re: bzImage decompression". LKML (Mailing list).
The zImage contain bootsect.o + setup.o + misc.o + piggy.o
Further reading
- Alavoor Vasudevan (2003-08-15). "10. Kernel Files Information". The Linux Kernel HOWTO.
- Daniel Pierre Bovet (2013-01-03). "Special sections in Linux binaries". LWN.net.
all special sections appearing in the Linux kernel end up packed in one of the segments defined in the vmlinux ELF header. Each special section fulfills a particular purpose.