Construction of the 
Linux kernel image 
Embedded Linux Course 
4-1
Linux Kernel Organization 
• Linux supports numerous architectures this 
means that it can be run on many types of 
processors, which include alpha, arm, i386, 
ia64, ppc, ppc64, and s390x. 
• Most of the source code is written in C and is 
hardware independent 
• A portion of the code is heavily hardware 
dependent and is written in a mix of C and 
assembly for the particular architecture. 
• The heavily machine-dependent portion is 
wrapped by a long list of system calls that serve 
as an interface. 
Embedded Linux Course
vmlinux image 
components 
Embedded Linux Course
make zImage V=1 
arm-linux-ld -EL -p --no-undefined -X -o vmlinux -T 
arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o 
arch/arm/kernel/init_task.o init/built-in.o --start-group 
usr/built-in.o arch/arm/kernel/built-in.o arch/arm/mm/built-in. 
o arch/arm/common/built-in.o arch/arm/mach-s3c2410/ 
built-in.o arch/arm/nwfpe/built-in.o kernel/built-in.o 
mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o 
crypto/built-in.o lib/lib.a arch/arm/lib/lib.a lib/built-in.o 
arch/arm/lib/built-in.o drivers/built-in.o sound/built-in.o 
net/built-in.o --end-group .tmp_kallsyms2.o 
0xC0008000 
Embedded Linux Course
Low-Level Architecture Objects 
Embedded Linux Course
Embedded Linux Course
Vmlinux 
(ELF object)objcopy 
Image 
(binary 
object) 
Embedded Linux Course 
gzip 
Asm wrapper around 
piggy.gz contains kernel 
image 
piggy.gz 
asm 
piggy.o 
Kernel 
proper 
Stipped 
binary 
kernel image 
compressed 
binary 
kernel 
misc.o 
head.o 
Bootable 
Kernel 
image 
Composite kernel image 
construction 
make zImage V=1
make zImage V=1 
make -f scripts/Makefile.build obj=arch/arm/boot MACHINE=arch/arm/mach-s3c2410/ 
arch/arm/boot/zImage 
arm-linux-objcopy -O binary -R .note -R .comment -S vmlinux 
arch/arm/boot/Image 
Kernel: arch/arm/boot/Image is ready 
------------------------------------------------------------------------------------------------------------- 
make -f scripts/Makefile.build obj=arch/arm/boot/compressed 
arch/arm/boot/compressed/vmlinux 
gzip -f -9 < arch/arm/boot/compressed/../Image > 
arch/arm/boot/compressed/piggy.gz 
arm-linux-gcc -Wp,-MD,arch/arm/boot/compressed/.piggy.o.d -nostdinc - 
isystem /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/include -D__KERNEL__ - 
Iinclude -mlittle-endian -D__ASSEMBLY__ -mapcs-32 -mno-thumb-interwork - 
D__LINUX_ARM_ARCH__=4 -march=armv4 -mtune=arm9tdmi -msoft-float -c - 
o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/piggy.S 
Embedded Linux Course
make zImage V=1 (cont.) 
arm-linux-ld -EL --defsym zreladdr=0x30008000 --defsym 
params_phys=0x30000100 -p --no-undefined -X 
/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a -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 -o 
arch/arm/boot/compressed/vmlinux 
arm-linux-objcopy -O binary -R .note -R .comment -S 
arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage 
Kernel: arch/arm/boot/zImage is ready 
refers to: arch/arm/mach-s3c2410/Makefile.boot 
Embedded Linux Course
Bootstrap Loader 
• Not to be confused with a bootloader, many 
architectures use a bootstrap loader (or second-stage 
loader) to load the Linux kernel image into 
memory. 
• Some bootstrap loaders perform checksum 
verification of the kernel image, and most 
perform decompression and relocation of the 
kernel image. 
• The bootloader controls the board upon power-up 
and does not rely on the Linux kernel in any 
way 
Embedded Linux Course
Bootstrap Loader (cont.) 
• In contrast, the bootstrap loader's primary 
purpose in life is to act as the glue between a 
board-level bootloader and the Linux kernel 
• It is the bootstrap loader's responsibility to 
provide a proper context for the kernel to run in, 
as well as perform the necessary steps to 
decompress and relocate the kernel binary 
image 
• It is similar to the concept of a primary and 
secondary loader found in the PC architecture. 
Embedded Linux Course
Composite kernel image : vmlinux 
Piggy.o Binary Kernel image 
misc.o 
head.o 
arm-linux-ld -EL --defsym zreladdr=0x30008000 
--defsym params_phys=0x30000100 -p --no-undefined -X 
/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a -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 -o arch/arm/boot/compressed/vmlinux 
Embedded Linux Course 
Bootstrap Loader
ARM boot control flow 
Uboot 
Embedded Linux Course 
head.o 
head.o 
main.o 
start 
start 
start_kernel 
Power On 
Boot loader Bootstrap 
loader 
Kernel 
vmlinux 
Kernel 
arch/arm/boot/compressed/head.S main.o 
arch/arm/kernel/head.S
Kernel Entry Point: head.o 
• arch/<ARCH>/kernel/head.S 
• The head.o module performs architecture- and 
often CPU-specific initialization in preparation for 
the main body of the kernel. CPU-specific tasks 
are kept as generic as possible across 
processor families 
• Machine-specific initialization is performed 
elsewhere 
Embedded Linux Course
head.o performs the following tasks 
• Checks for valid processor and architecture 
• Creates initial page table entries 
• Enables the processor's memory management 
unit (MMU) 
• Establishes limited error detection and reporting 
• Jumps to the start of the kernel proper, main.c 
Embedded Linux Course
Kernel Startup: main.c 
• Every architecture's head.o module has a similar 
construct for passing control to the kernel 
proper. 
– b start_kernel 
• start_kernel() located in .../init/main.c. 
• main.c does all the startup work for the Linux 
kernel, from initializing the first kernel thread all 
the way to mounting a root file system and 
executing the very first user space Linux 
application program. 
Embedded Linux Course
Further Study 
• See the architecture-dependent portions of the 
linux source code, for example, system 
initialization and bootstrapping, exception vector 
handling, address translation, and device I/O. 
• Cross-Referencing Linux 
– http://lxr.linux.no 
To create a device driver, the programmer must have a 
register-leve specification for a given piece of hardware 
Embedded Linux Course

Linux Kernel Image

  • 1.
    Construction of the Linux kernel image Embedded Linux Course 4-1
  • 2.
    Linux Kernel Organization • Linux supports numerous architectures this means that it can be run on many types of processors, which include alpha, arm, i386, ia64, ppc, ppc64, and s390x. • Most of the source code is written in C and is hardware independent • A portion of the code is heavily hardware dependent and is written in a mix of C and assembly for the particular architecture. • The heavily machine-dependent portion is wrapped by a long list of system calls that serve as an interface. Embedded Linux Course
  • 3.
    vmlinux image components Embedded Linux Course
  • 4.
    make zImage V=1 arm-linux-ld -EL -p --no-undefined -X -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o --start-group usr/built-in.o arch/arm/kernel/built-in.o arch/arm/mm/built-in. o arch/arm/common/built-in.o arch/arm/mach-s3c2410/ built-in.o arch/arm/nwfpe/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o lib/lib.a arch/arm/lib/lib.a lib/built-in.o arch/arm/lib/built-in.o drivers/built-in.o sound/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o 0xC0008000 Embedded Linux Course
  • 5.
    Low-Level Architecture Objects Embedded Linux Course
  • 6.
  • 7.
    Vmlinux (ELF object)objcopy Image (binary object) Embedded Linux Course gzip Asm wrapper around piggy.gz contains kernel image piggy.gz asm piggy.o Kernel proper Stipped binary kernel image compressed binary kernel misc.o head.o Bootable Kernel image Composite kernel image construction make zImage V=1
  • 8.
    make zImage V=1 make -f scripts/Makefile.build obj=arch/arm/boot MACHINE=arch/arm/mach-s3c2410/ arch/arm/boot/zImage arm-linux-objcopy -O binary -R .note -R .comment -S vmlinux arch/arm/boot/Image Kernel: arch/arm/boot/Image is ready ------------------------------------------------------------------------------------------------------------- make -f scripts/Makefile.build obj=arch/arm/boot/compressed arch/arm/boot/compressed/vmlinux gzip -f -9 < arch/arm/boot/compressed/../Image > arch/arm/boot/compressed/piggy.gz arm-linux-gcc -Wp,-MD,arch/arm/boot/compressed/.piggy.o.d -nostdinc - isystem /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/include -D__KERNEL__ - Iinclude -mlittle-endian -D__ASSEMBLY__ -mapcs-32 -mno-thumb-interwork - D__LINUX_ARM_ARCH__=4 -march=armv4 -mtune=arm9tdmi -msoft-float -c - o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/piggy.S Embedded Linux Course
  • 9.
    make zImage V=1(cont.) arm-linux-ld -EL --defsym zreladdr=0x30008000 --defsym params_phys=0x30000100 -p --no-undefined -X /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a -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 -o arch/arm/boot/compressed/vmlinux arm-linux-objcopy -O binary -R .note -R .comment -S arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready refers to: arch/arm/mach-s3c2410/Makefile.boot Embedded Linux Course
  • 10.
    Bootstrap Loader •Not to be confused with a bootloader, many architectures use a bootstrap loader (or second-stage loader) to load the Linux kernel image into memory. • Some bootstrap loaders perform checksum verification of the kernel image, and most perform decompression and relocation of the kernel image. • The bootloader controls the board upon power-up and does not rely on the Linux kernel in any way Embedded Linux Course
  • 11.
    Bootstrap Loader (cont.) • In contrast, the bootstrap loader's primary purpose in life is to act as the glue between a board-level bootloader and the Linux kernel • It is the bootstrap loader's responsibility to provide a proper context for the kernel to run in, as well as perform the necessary steps to decompress and relocate the kernel binary image • It is similar to the concept of a primary and secondary loader found in the PC architecture. Embedded Linux Course
  • 12.
    Composite kernel image: vmlinux Piggy.o Binary Kernel image misc.o head.o arm-linux-ld -EL --defsym zreladdr=0x30008000 --defsym params_phys=0x30000100 -p --no-undefined -X /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a -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 -o arch/arm/boot/compressed/vmlinux Embedded Linux Course Bootstrap Loader
  • 13.
    ARM boot controlflow Uboot Embedded Linux Course head.o head.o main.o start start start_kernel Power On Boot loader Bootstrap loader Kernel vmlinux Kernel arch/arm/boot/compressed/head.S main.o arch/arm/kernel/head.S
  • 14.
    Kernel Entry Point:head.o • arch/<ARCH>/kernel/head.S • The head.o module performs architecture- and often CPU-specific initialization in preparation for the main body of the kernel. CPU-specific tasks are kept as generic as possible across processor families • Machine-specific initialization is performed elsewhere Embedded Linux Course
  • 15.
    head.o performs thefollowing tasks • Checks for valid processor and architecture • Creates initial page table entries • Enables the processor's memory management unit (MMU) • Establishes limited error detection and reporting • Jumps to the start of the kernel proper, main.c Embedded Linux Course
  • 16.
    Kernel Startup: main.c • Every architecture's head.o module has a similar construct for passing control to the kernel proper. – b start_kernel • start_kernel() located in .../init/main.c. • main.c does all the startup work for the Linux kernel, from initializing the first kernel thread all the way to mounting a root file system and executing the very first user space Linux application program. Embedded Linux Course
  • 17.
    Further Study •See the architecture-dependent portions of the linux source code, for example, system initialization and bootstrapping, exception vector handling, address translation, and device I/O. • Cross-Referencing Linux – http://lxr.linux.no To create a device driver, the programmer must have a register-leve specification for a given piece of hardware Embedded Linux Course