perf(kernel): kernel static all-zero -> .bss (image 812K -> 173K): domain::Slot (repr(u8) Empty=0) for tables, zero generation counters, core ids by position, pool/platform installed at boot; Option-backed Slot under kani (cbmc speed); build fails if .data > 16K
This commit is contained in:
@@ -57,6 +57,10 @@ pub fn init(uart: &Uart, boot_hart: usize) -> &'static mut mmu::PageTable {
|
||||
let riscv_platform =
|
||||
platform::RiscVPlatform::new(kernel_pt as *const mmu::PageTable as usize, harts as u8);
|
||||
crate::kern_mut().install_platform(riscv_platform);
|
||||
crate::kern_mut().install_pool(
|
||||
types::address::PhysicalAddress::from_raw(board::USER_POOL_BASE),
|
||||
board::USER_POOL_PAGES,
|
||||
);
|
||||
|
||||
kernel_pt
|
||||
}
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
use core::cell::UnsafeCell;
|
||||
use core::mem::MaybeUninit;
|
||||
use core::sync::atomic::{AtomicBool, Ordering};
|
||||
|
||||
pub struct KernelCell<T> {
|
||||
initialized: AtomicBool,
|
||||
inner: UnsafeCell<MaybeUninit<T>>,
|
||||
}
|
||||
|
||||
@@ -15,14 +13,12 @@ impl<T> KernelCell<T> {
|
||||
/// never lives on the stack.
|
||||
pub const fn new(value: T) -> Self {
|
||||
Self {
|
||||
initialized: AtomicBool::new(true),
|
||||
inner: UnsafeCell::new(MaybeUninit::new(value)),
|
||||
}
|
||||
}
|
||||
|
||||
/// Raw pointer to the kernel; callers must avoid aliasing `&mut`.
|
||||
pub fn as_ptr(&self) -> *mut T {
|
||||
debug_assert!(self.initialized.load(Ordering::Acquire));
|
||||
unsafe { (*self.inner.get()).as_mut_ptr() }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,14 +15,15 @@ mod trap;
|
||||
use hw::uart::Uart;
|
||||
use kernel_cell::KernelCell;
|
||||
|
||||
/// Built at compile time; boot installs the real platform before anything
|
||||
/// runs.
|
||||
/// Built at compile time with nothing in it (no platform, no cores, no
|
||||
/// pool), so every byte is zero and it lives in `.bss`, not in the image;
|
||||
/// boot installs the platform and the pool before anything runs.
|
||||
static KERNEL: KernelCell<kernel::Kernel<platform::RiscVPlatform>> =
|
||||
KernelCell::new(kernel::Kernel::with_cores(
|
||||
platform::RiscVPlatform::new(0, 1),
|
||||
1,
|
||||
types::address::PhysicalAddress::from_raw(board::USER_POOL_BASE),
|
||||
board::USER_POOL_PAGES,
|
||||
platform::RiscVPlatform::new(0, 0),
|
||||
0,
|
||||
types::address::PhysicalAddress::from_raw(0),
|
||||
0,
|
||||
));
|
||||
|
||||
fn kern_mut() -> &'static mut kernel::Kernel<platform::RiscVPlatform> {
|
||||
|
||||
Reference in New Issue
Block a user