Files
rustkernel/kernel/src/lib.rs
2025-12-02 00:03:46 +01:00

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)
}