174 líneas
4.9 KiB
Rust
174 líneas
4.9 KiB
Rust
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
//! The Rust kernel crate.
|
|
//!
|
|
//! This crate provides the core kernel APIs and functionality for the Rust
|
|
//! kernel. It is inspired by the Linux kernel's Rust infrastructure but
|
|
//! designed as a standalone kernel implementation.
|
|
|
|
#![no_std]
|
|
#![feature(alloc_error_handler)]
|
|
#![feature(panic_info_message)]
|
|
#![feature(asm_const)]
|
|
#![feature(const_mut_refs)]
|
|
#![feature(custom_test_frameworks)]
|
|
#![feature(allocator_api)]
|
|
#![test_runner(crate::test_runner)]
|
|
#![reexport_test_harness_main = "test_main"]
|
|
|
|
extern crate alloc;
|
|
|
|
// Include boot assembly
|
|
// #[cfg(target_arch = "x86_64")]
|
|
// global_asm!(include_str!("arch/x86_64/boot.s"), options(att_syntax));
|
|
|
|
pub mod arch;
|
|
pub mod benchmark; // Performance benchmarking
|
|
pub mod boot;
|
|
pub mod console;
|
|
pub mod cpu;
|
|
pub mod device;
|
|
pub mod device_advanced;
|
|
pub mod diagnostics; // System diagnostics and health monitoring
|
|
pub mod driver;
|
|
pub mod drivers_init; // Driver initialization
|
|
pub mod enhanced_scheduler; // Enhanced preemptive scheduler
|
|
pub mod error;
|
|
pub mod fs;
|
|
pub mod hardware; // Hardware detection and initialization
|
|
pub mod init;
|
|
pub mod interrupt;
|
|
pub mod ipc; // Inter-process communication
|
|
pub mod kthread; // Kernel thread management
|
|
pub mod logging; // Kernel logging and debugging
|
|
pub mod memfs; // In-memory file system
|
|
pub mod memory;
|
|
pub mod module;
|
|
pub mod module_loader; // Dynamic module loading
|
|
pub mod net_basic; // Basic networking support
|
|
pub mod network;
|
|
pub mod network_stub; // Basic network stub
|
|
// pub mod network_advanced; // Advanced networking stack (removed for now)
|
|
pub mod advanced_perf; // Advanced performance monitoring and profiling
|
|
pub mod panic;
|
|
pub mod perf; // Performance monitoring
|
|
pub mod prelude;
|
|
pub mod process;
|
|
pub mod scheduler;
|
|
pub mod shell; // Kernel shell interface
|
|
pub mod stress_test; // System stress testing
|
|
pub mod sync;
|
|
pub mod syscall;
|
|
pub mod syscalls; // New syscall infrastructure
|
|
pub mod sysinfo; // System information and hardware detection
|
|
pub mod task;
|
|
pub mod test_init; // Kernel initialization testing
|
|
pub mod test_suite; // Comprehensive kernel test suite
|
|
pub mod time;
|
|
pub mod timer; // Timer interrupt and preemptive scheduling
|
|
pub mod types;
|
|
pub mod usermode;
|
|
pub mod working_task; // Working kernel task implementation // User mode program support
|
|
|
|
/// Kernel version information
|
|
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
|
|
pub const NAME: &str = "Rust Kernel";
|
|
|
|
/// Kernel entry point called from architecture-specific code
|
|
/// This is called from the boot assembly with multiboot information
|
|
#[no_mangle]
|
|
pub extern "C" fn kernel_main() -> ! {
|
|
// Early initialization without memory allocation
|
|
early_kernel_init();
|
|
|
|
// Initialize memory management
|
|
if let Err(e) = memory_init() {
|
|
panic!("Memory initialization failed: {:?}", e);
|
|
}
|
|
|
|
// Now we can use allocations, continue with full initialization
|
|
init::early_init();
|
|
init::main_init();
|
|
|
|
// Should not return from main_init
|
|
panic!("kernel_main returned unexpectedly");
|
|
}
|
|
|
|
/// Kernel entry point with multiboot parameters
|
|
#[no_mangle]
|
|
pub extern "C" fn kernel_main_multiboot(multiboot_magic: u32, multiboot_addr: u32) -> ! {
|
|
// Verify multiboot magic number
|
|
if multiboot_magic != 0x36d76289 && multiboot_magic != 0x2BADB002 {
|
|
panic!("Invalid multiboot magic: 0x{:x}", multiboot_magic);
|
|
}
|
|
|
|
// Store multiboot information
|
|
boot::set_multiboot_info(multiboot_addr as usize);
|
|
|
|
// Continue with normal boot
|
|
kernel_main();
|
|
}
|
|
|
|
/// Early kernel initialization before memory allocator is available
|
|
fn early_kernel_init() {
|
|
// Initialize console first so we can print messages
|
|
if let Err(_) = console::init() {
|
|
// Can't print error since console isn't initialized
|
|
loop {}
|
|
}
|
|
|
|
crate::println!("Rust Kernel v{} starting...", VERSION);
|
|
crate::println!("Early kernel initialization");
|
|
}
|
|
|
|
/// Initialize memory management using multiboot information
|
|
fn memory_init() -> Result<(), error::Error> {
|
|
if let Some(multiboot_addr) = boot::get_boot_info().multiboot_addr {
|
|
boot::multiboot::init_memory_from_multiboot(multiboot_addr)?;
|
|
} else {
|
|
// Fallback: initialize with default memory layout
|
|
memory::page::init()?;
|
|
}
|
|
|
|
// Initialize heap allocator
|
|
memory::kmalloc::init()?;
|
|
memory::vmalloc::init()?;
|
|
|
|
info!("Memory management initialized");
|
|
Ok(())
|
|
}
|
|
|
|
/// Test runner for kernel tests
|
|
#[cfg(test)]
|
|
fn test_runner(tests: &[&dyn Fn()]) {
|
|
println!("Running {} tests", tests.len());
|
|
for test in tests {
|
|
test();
|
|
}
|
|
exit_qemu(QemuExitCode::Success);
|
|
}
|
|
|
|
#[cfg(test)]
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
#[repr(u32)]
|
|
pub enum QemuExitCode {
|
|
Success = 0x10,
|
|
Failed = 0x11,
|
|
}
|
|
|
|
#[cfg(test)]
|
|
pub fn exit_qemu(exit_code: QemuExitCode) {
|
|
use arch::x86_64::port::Port;
|
|
|
|
unsafe {
|
|
let mut port = Port::new(0xf4);
|
|
port.write(exit_code as u32);
|
|
}
|
|
}
|
|
|
|
/// Global allocator error handler
|
|
#[alloc_error_handler]
|
|
fn alloc_error_handler(layout: alloc::alloc::Layout) -> ! {
|
|
panic!("allocation error: {:?}", layout)
|
|
}
|