EFIBootLoaders

EFI/UEFI Boot Loaders

UEFI defines a new method of interfacing between PC operating systems and firmware. The UEFI interface is composed of data tables containng platform-related information, plus boot and runtime functions that are available to the operating system and the boot loader. These provide a standard environment for booting and running pre-boot applications.

The table following lists known features found in current EFI/UEFI capable boot loaders and boot managers. (Note: Boot managers present a menu of boot options, whereas boot loaders load a kernel. Many programs can do both tasks, although rEFIt and rEFInd can load a kernel only if it includes an EFI stub loader.)

Key: Y - feature known to exist, ? - cannot determine, blank - feature does not exist

UEFI/EFI Bootloader Features

BIOS Bootloader

ELILO

Grub 2

Kernel EFI stub loader

rEFIt

rEFInd

Grub 0.97

Features

LILO like EFI boot loader, originally developed for IA-64 by HP, now with IA-32 support

Grub 2 with EFI support

Boot loader built into 3.3.0 and later kernels; turns the kernel into its own boot loader

EFI graphical boot manager, originally for Apple Macs

EFI graphical boot manager, forked from rEFIt because of rEFIt's apparent abandonment

BIOS Only

Graphical boot manager

Y

Y

Y

Background

JPG images

Y

BMP images

Y

Y

PNG images

Y

XPM images

?

Y

ICNS images

?

Y

Y

?

Text boot manager

Y

Y

Y

Y

Y

Mouse support

Config file

Y

Y

Y

Y

Y

specify kernel image

Y

Y

Y

Y

interactive mode

Y

Y

Y

load initrd

Y

Y

Y

Y

Y

kernel selector menu

Y

Y

Y

Y

kernel boot params

Y

Y

Y

Y

Boot once and then revert to previous kernel

Y

Variables to paramaterize boot e.g. root=/dev/nfs ip=%I:%z:%G:%N

Y

Enable legacy BIOS

?

Y

Y

BIOS ONLY

Chain loading

Y

Y

Y

Y

Gzip compression support

Y

Y

Y

Y

Load ELF binaries

Y

Y

IA-64

Y

?

Y

?

x86-32

Y

Y

Y

Y

Y

Y

x86-64

Y

Y

Y

Y

Y

Y

Apple fat image

Y

Boot unmodified linux kernel

Y

Y

Y

Y

Y

Relocate Kernel

IA-64 modified kernel

Load FPSWA driver (Floating Point Software Assist)

Y (IA-64 only)

N/A

Font Support

Y

Y

?

File System Support:

AFFS

Y

AFS

Y

Btrfs

Y

Y

CPIO

Y

FAT

Y

Y

Y

Y

Y

Y

EXT2

Y

Y

Y

Y

Y

Y

EXT3

Y

Y

Y

Y

Y

Y

EXT4

Y

Y

Y (Jaunty+)

FFS

Y

Y

HFS

Y

HFSPLUS

Y

Y

Y

Y

Y

ISO9660

Y

Y

Y

Y

Y

Y

JFS

Y

Y

MINIX

Y

Y

NTFS

Y

NTFSCOMP

Y

REISERFS

Y

Y

Y

Y

Y

Y

SFS (Amiga)

Y

UDF

Y

UFS

Y

Y

XFS

Y

Y

NOTE:

ELILO loads kernel + initrd using EFI, hence only supports VFAT or, via EFI drivers, ext2, ext3, ext4, ReiserFS, Btrfs, HFS+, or ISO-9660

Same comment as for ELILO

Same comment as for ELILO

Same comment as for ELILO

Disk Volume/Partition Support:

RAID

Y

Y

LVM

Y

Y

ADFS (Acorn) partition maps

Y

Amiga Patition Tables

Y

Macintosh Partition Tables

Y

PC (MBR) Partition Tables

Y

Y

Y

Y

Y

Sun Partition Tables

Y

GPT (GUID Partition Tables) (UEFI)

Y

Y

Y

Y

Y

Disk Loopback

Y

Find filesystems by UUID or label

Y

Y (Intrepid+)

Commands

Y

background

Y

beep sound PC speaker

Y

print file block list

Y

Y

set border colour

Y

cat files

Y

Y

clear screen

Y

compare files

Y

Y

cpu ID

Y

debug mode

Y

Y

display APM BIOS info

N/A

N/A

N/A

N/A

N/A

Y

display memory info

Y

dump file (copy)

Y

echo / print

Y

Y

fallback to known kernel

Y

find a file on partitions

Y

file system test mode

Y

help

Y

Y

print geometry of disk

Y

manually load config file

Y

halt machine

Y

Y

Y

Y

hide a partition

Y

hexdump a file

Y

intel multiprocessor probe

Y

i/o port probe a drive

Y

load/save environment variables

Y

ls files

Y

lspci

Y

make a drive bootable

Y

map one drive to another

Y

screen pager

Y

partition manipulation

Y

pause/sleep

Y

Y

read variables from user input

Y

read memory address

Y

reboot computer

Y

Y

Y

select terminal

Y

serial console support

Y

set keyboard mappings

Y

expression handling

Y

video testing

Y

list vbe modes

Y

Y

vbe test

Y

load font files

Y

block users from using EFI shell

Y

Y

disable booting from optical drive

Y

Y

disable booting from internal drives

Y

Y

block apple HW testing

Y

Y

Toolchain Contraints

IA-64: gcc version

3.1, 3.2

?

?

?

?

?

IA-64: binutils

2.13.90

?

?

?

?

?

x86-32: gcc-version

3.2

?

?

?

?

?

x86-32: binutils

2.13.90.0.2

?

?

?

?

?

x86-64: gcc-version

4.1.1+

?

?

?

?

?

x86-64: bintil

2.17.50.0.14+

?

?

?

?

?

Netboot

PXE

Y

DCHP

Y

Y

TFTP

Y

Y

BOOTP

Y

IFCONFIG

?

Y

RARP

Y

Booting from EFI

All EFI compliant systems have an EFI System Partition (ESP), which is a FAT32 partition containing EFI firmware modules and boot images. Note that there can be one or more system partions. The ESP is effectively the boot partition, and contains the necessary images to boot a system. This boot partition should probably be mounted on a Linux system as /boot/efi for the updating of new kernels and initrd images.

Each vendor "must" use a dedicated directory in \EFI\vendor for the .efi bootloader code.

nshell is the EFI shell. It will execute the boot script called startup.nsh found in the root of an ESP. startup.nsh can be used to load and execute the preferred boot loader. More commonly, a list of boot loaders is maintained in NVRAM variables called Boot####, where #### is a hexadecimal number. The boot order is maintained in the BootOrder variable. These variables can be manipulated in Linux with the efibootmgr utility. If the NVRAM contains no such entries or if they're all invalid, recent EFI implementations default to using a boot loader of the form \EFI\BOOT\boot{arch}.efi, where {arch} is an architecture code, such as "x64" for x86-64 or "ia32" for x86.

All EFI executable images contain a PE/COFF header defining the format of the executable code. The code may be one of:

  • IA-32
  • x86-64 (aka X64)
  • Itaninum
  • ARM
  • Processor agnostic generic EFI byte code

ELILO, the kernel's EFI stub loader, Grub 2 (with EFI support), rEFIt, and rEFInd are all processor native executable code.

KERNEL configuration

Build the kernel with the following configuration.

    CONFIG_FB_EFI=y
    CONFIG_FRAMEBUFFER_CONSOLE=y

If EFI runtime services are expected, the following configuration should be selected.

    CONFIG_EFI=y
    CONFIG_EFI_VARS=y or m          # optional 

To use the EFI stub loader, you must set the following option:

    CONFIG_EFI_STUB=y

The kernel can then be loaded from an EFI shell or by entering it into the EFI's boot list in NVRAM. Getting the options right can be tricky, though. Using rEFInd to launch a kernel with EFI stub support can simplify matters.

References

EFIBootLoaders (last edited 2013-09-23 18:15:38 by rodsmith)