Skip to main content

ZbiKernel

Type Alias ZbiKernel 

Source
pub type ZbiKernel = zbi_kernel_t;
Expand description

The kernel image.

In a bootable ZBI this item must always be first, immediately after the ZbiType::Container header. The contiguous memory image of the kernel is formed from the ZbiType::Container header, the ZbiType::Kernel{ARCH} header, and the payload.

The boot loader loads the whole image starting with the container header through to the end of the kernel item’s payload into contiguous physical memory. It then constructs a partial ZBI elsewhere in memory, which has a ZbiType::Container header of its own followed by all the other items that were in the booted ZBI plus other items synthesized by the boot loader to describe the machine. This partial ZBI must be placed at an address (where the container header is found) that is aligned to the machine’s page size. The precise protocol for transferring control to the kernel’s entry point varies by machine.

On all machines, the kernel requires some amount of scratch memory to be available immediately after the kernel image at boot. It needs this space for early setup work before it has a chance to read any memory-map information from the boot loader. The reserve_memory_size field tells the boot loader how much space after the kernel’s load image it must leave available for the kernel’s use. The boot loader must place its constructed ZBI or other reserved areas at least this many bytes after the kernel image.

§x86-64

The kernel assumes it was loaded at a fixed physical address of 0x100000 (1MB). ZbiKernel.entry is the absolute physical address of the PC location where the kernel will start. TODO(https://fxbug.dev/42098994): Perhaps this will change?? The processor is in 64-bit mode with direct virtual to physical mapping covering the physical memory where the kernel and bootloader-constructed ZBI were loaded. The %rsi register holds the physical address of the bootloader-constructed ZBI. All other registers are unspecified.

§ARM64

ZbiKernel.entry is an offset from the beginning of the image (i.e., the ZbiType::Container header before the ZbiType::KernelArm64 header) to the PC location in the image where the kernel will start. The processor is in physical address mode at EL1 or above. The kernel image and the bootloader-constructed ZBI each can be loaded anywhere in physical memory. The x0 register holds the physical address of the bootloader-constructed ZBI. All other registers are unspecified.

§RISCV64

ZbiKernel.entry is an offset from the beginning of the image (i.e., the ZbiType::Container header before the ZbiType::KernelRiscv64 header) to the PC location in the image where the kernel will start. The processor is in S mode, satp is zero, sstatus.SIE is zero. The kernel image and the bootloader-constructed ZBI each can be loaded anywhere in physical memory, aligned to 4KiB. The a0 register holds the HART ID, and the a1 register holds the 4KiB-aligned physical address of the bootloader-constructed ZBI. All other registers are unspecified.

§C-reference type

typedef struct {
  // Entry-point address.  The interpretation of this differs by machine.
  uint64_t entry;

  // Minimum amount (in bytes) of scratch memory that the kernel requires
  // immediately after its load image.
  uint64_t reserve_memory_size;
} zbi_kernel_t;

Aliased Type§

#[repr(C)]
pub struct ZbiKernel { pub entry: u64, pub reserve_memory_size: u64, }

Fields§

§entry: u64§reserve_memory_size: u64