Crate linux_loader

source ·
Expand description

A Linux kernel image loading crate.

This crate offers support for loading raw ELF (vmlinux), compressed big zImage (bzImage) and PE (Image) kernel images. ELF support includes the Linux and PVH boot protocols. Support for any other kernel image format can be added by implementing the KernelLoader and BootConfigurator.

§Platform support

  • x86_64
  • ARM64

§Example - load an ELF kernel and configure boot params with the PVH protocol

This example shows how to prepare a VM for booting with an ELF kernel, following the PVH boot protocol.


fn build_boot_params() -> (hvm_start_info, Vec<hvm_memmap_table_entry>) {
    let mut start_info = hvm_start_info::default();
    let memmap_entry = hvm_memmap_table_entry {
        addr: 0x7000,
        size: 0,
        type_: E820_RAM,
        reserved: 0,
    };
    start_info.magic = XEN_HVM_START_MAGIC_VALUE;
    start_info.version = 1;
    start_info.nr_modules = 0;
    start_info.memmap_entries = 0;
    (start_info, vec![memmap_entry])
}

fn main() {
    let guest_mem = GuestMemoryMmap::from_ranges(&[(GuestAddress(0x0), MEM_SIZE)]).unwrap();

    let mut elf_pvh_image = Vec::new();
    let path = concat!(
        env!("CARGO_MANIFEST_DIR"),
        "/src/loader/x86_64/elf/test_elfnote.bin"
    );
    let mut file = File::open(path).unwrap();
    file.read_to_end(&mut elf_pvh_image).unwrap();

    // Load the kernel image.
    let loader_result =
        Elf::load(&guest_mem, None, &mut Cursor::new(&elf_pvh_image), None).unwrap();

    // Build boot parameters.
    let (mut start_info, memmap_entries) = build_boot_params();
    // Address in guest memory where the `start_info` struct will be written.
    let start_info_addr = GuestAddress(0x6000);
    // Address in guest memory where the memory map will be written.
    let memmap_addr = GuestAddress(0x7000);
    start_info.memmap_paddr = memmap_addr.raw_value();

    // Write boot parameters in guest memory.
    let mut boot_params = BootParams::new::<hvm_start_info>(&start_info, start_info_addr);
    boot_params.set_sections::<hvm_memmap_table_entry>(&memmap_entries, memmap_addr);
    PvhBootConfigurator::write_bootparams::<GuestMemoryMmap>(&boot_params, &guest_mem).unwrap();
}

Modules§

  • Helper for creating valid kernel command line strings.
  • configuratorelf or pe or bzimage
    Traits and structs for configuring and loading boot parameters.
  • elfx86 or x86-64
  • Traits and structs for loading kernels into guest memory.
  • start_infox86 or x86-64