#[repr(C)]pub struct Kernel {
pub entry: u64,
pub reserve_memory_size: u64,
}
Expand description
The kernel image. In a bootable ZBI this item must always be first, immediately after the ZBI_TYPE_CONTAINER header. The contiguous memory image of the kernel is formed from the ZBI_TYPE_CONTAINER header, the ZBI_TYPE_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 ZBI_TYPE_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). zbi_kernel_t.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
zbi_kernel_t.entry is an offset from the beginning of the image
(i.e., the ZBI_TYPE_CONTAINER header before the ZBI_TYPE_KERNEL_ARM64
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
zbi_kernel_t.entry is an offset from the beginning of the image (i.e.,
the ZBI_TYPE_CONTAINER header before the ZBI_TYPE_KERNEL_RISCV64 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.
Fields§
§entry: u64
Entry-point address. The interpretation of this differs by machine.
reserve_memory_size: u64
Minimum amount (in bytes) of scratch memory that the kernel requires immediately after its load image.
Trait Implementations§
Source§impl FromBytes for Kernelwhere
u64: FromBytes,
impl FromBytes for Kernelwhere
u64: FromBytes,
Source§impl IntoBytes for Kernel
impl IntoBytes for Kernel
§fn as_mut_bytes(&mut self) -> &mut [u8] ⓘwhere
Self: FromBytes,
fn as_mut_bytes(&mut self) -> &mut [u8] ⓘwhere
Self: FromBytes,
Source§impl TryFromBytes for Kernelwhere
u64: TryFromBytes,
impl TryFromBytes for Kernelwhere
u64: TryFromBytes,
§fn try_read_from_bytes(
source: &[u8],
) -> Result<Self, ConvertError<Infallible, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: Sized,
fn try_read_from_bytes(
source: &[u8],
) -> Result<Self, ConvertError<Infallible, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: Sized,
§fn try_read_from_prefix(
source: &[u8],
) -> Result<(Self, &[u8]), ConvertError<Infallible, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: Sized,
fn try_read_from_prefix(
source: &[u8],
) -> Result<(Self, &[u8]), ConvertError<Infallible, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: Sized,
§fn try_read_from_suffix(
source: &[u8],
) -> Result<(&[u8], Self), ConvertError<Infallible, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: Sized,
fn try_read_from_suffix(
source: &[u8],
) -> Result<(&[u8], Self), ConvertError<Infallible, SizeError<&[u8], Self>, ValidityError<&[u8], Self>>>where
Self: Sized,
impl Copy for Kernel
impl Eq for Kernel
impl StructuralPartialEq for Kernel
Auto Trait Implementations§
impl Freeze for Kernel
impl RefUnwindSafe for Kernel
impl Send for Kernel
impl Sync for Kernel
impl Unpin for Kernel
impl UnwindSafe for Kernel
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)