refactor(adapter-riscv): split kmain into boot/, devices/ modules
kmain is now 20 lines — six function calls: hardware::init → BSS, MMU, traps, timer, PLIC, kernel loader::load_init → read init.elf, create process, map ELF loader::load_server → read server ELF, create process, map ELF storage_setup → VirtIO block re-init, shared buffer, phys-info gpu_setup → VirtIO GPU init, framebuffer alloc, phys-info caps::grant_all → endpoints, capability grants New modules: boot/hardware.rs — hardware init (BSS, MMU, traps, kernel) boot/loader.rs — ELF loading, thread setup, enter_userspace boot/caps.rs — endpoint creation, capability grants devices/storage_setup.rs — VirtIO block for storage server devices/gpu_setup.rs — VirtIO GPU for display server All unsafe contained in hw/, mmu/, trap/. Boot and device modules call safe wrappers.
This commit is contained in:
52
crates/adapter-riscv/src/boot/hardware.rs
Normal file
52
crates/adapter-riscv/src/boot/hardware.rs
Normal file
@@ -0,0 +1,52 @@
|
||||
use crate::hw::uart::Uart;
|
||||
use crate::hw::virtio_blk::VirtioBlk;
|
||||
use crate::{board, kernel_cell::KernelCell, mmu, platform, trap, KERNEL};
|
||||
|
||||
unsafe extern "C" {
|
||||
static _bss_start: u8;
|
||||
static _bss_end: u8;
|
||||
static _heap_start: u8;
|
||||
}
|
||||
|
||||
pub fn init(uart: &Uart) -> &'static mut mmu::PageTable {
|
||||
zero_bss();
|
||||
|
||||
let heap_start = unsafe { &_heap_start as *const u8 as usize };
|
||||
mmu::init_allocator(heap_start);
|
||||
let kernel_pt = mmu::init_kernel_page_table();
|
||||
mmu::activate(kernel_pt);
|
||||
uart.write_str("k-os: MMU enabled (Sv39)\n");
|
||||
|
||||
trap::init();
|
||||
crate::hw::timer::init();
|
||||
crate::hw::plic::Plic::init();
|
||||
uart.write_str("k-os: traps and timer initialized\n");
|
||||
|
||||
let riscv_platform = platform::RiscVPlatform::new(kernel_pt as *const mmu::PageTable as usize);
|
||||
let pool = domain::memory::page_pool::PagePool::new(
|
||||
types::address::PhysicalAddress::from_raw(board::USER_POOL_BASE),
|
||||
board::USER_POOL_PAGES,
|
||||
);
|
||||
KERNEL.init(kernel::Kernel::new(riscv_platform, pool));
|
||||
|
||||
kernel_pt
|
||||
}
|
||||
|
||||
pub fn probe_block_device(uart: &Uart) -> Option<VirtioBlk> {
|
||||
let blk = VirtioBlk::probe();
|
||||
if blk.is_some() {
|
||||
uart.write_str("k-os: VirtIO block device found\n");
|
||||
} else {
|
||||
uart.write_str("k-os: no block device\n");
|
||||
}
|
||||
blk
|
||||
}
|
||||
|
||||
fn zero_bss() {
|
||||
unsafe {
|
||||
let start = &_bss_start as *const u8 as *mut u8;
|
||||
let end = &_bss_end as *const u8 as *mut u8;
|
||||
let len = end as usize - start as usize;
|
||||
core::ptr::write_bytes(start, 0, len);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user