1*c566df45SLoGin //! 这个文件内放置初始内核线程的代码。 2*c566df45SLoGin 3*c566df45SLoGin use alloc::string::String; 4*c566df45SLoGin use system_error::SystemError; 5*c566df45SLoGin 6*c566df45SLoGin use crate::{ 7*c566df45SLoGin arch::process::arch_switch_to_user, 8*c566df45SLoGin driver::{ 9*c566df45SLoGin disk::ahci::ahci_init, net::e1000e::e1000e::e1000e_init, virtio::virtio::virtio_probe, 10*c566df45SLoGin }, 11*c566df45SLoGin filesystem::vfs::core::mount_root_fs, 12*c566df45SLoGin kdebug, kerror, 13*c566df45SLoGin net::net_core::net_init, 14*c566df45SLoGin process::{kthread::KernelThreadMechanism, process::stdio_init}, 15*c566df45SLoGin }; 16*c566df45SLoGin 17*c566df45SLoGin use super::initcall::do_initcalls; 18*c566df45SLoGin 19*c566df45SLoGin pub fn initial_kernel_thread() -> i32 { 20*c566df45SLoGin kernel_init().unwrap_or_else(|err| { 21*c566df45SLoGin panic!("Failed to initialize kernel: {:?}", err); 22*c566df45SLoGin }); 23*c566df45SLoGin 24*c566df45SLoGin switch_to_user(); 25*c566df45SLoGin 26*c566df45SLoGin loop {} 27*c566df45SLoGin } 28*c566df45SLoGin 29*c566df45SLoGin fn kernel_init() -> Result<(), SystemError> { 30*c566df45SLoGin kenrel_init_freeable()?; 31*c566df45SLoGin 32*c566df45SLoGin KernelThreadMechanism::init_stage2(); 33*c566df45SLoGin 34*c566df45SLoGin // 由于目前加锁,速度过慢,所以先不开启双缓冲 35*c566df45SLoGin // scm_enable_double_buffer().expect("Failed to enable double buffer"); 36*c566df45SLoGin stdio_init().expect("Failed to initialize stdio"); 37*c566df45SLoGin 38*c566df45SLoGin ahci_init().expect("Failed to initialize AHCI"); 39*c566df45SLoGin 40*c566df45SLoGin mount_root_fs().expect("Failed to mount root fs"); 41*c566df45SLoGin 42*c566df45SLoGin virtio_probe(); 43*c566df45SLoGin e1000e_init(); 44*c566df45SLoGin net_init().unwrap_or_else(|err| { 45*c566df45SLoGin kerror!("Failed to initialize network: {:?}", err); 46*c566df45SLoGin }); 47*c566df45SLoGin 48*c566df45SLoGin kdebug!("initial kernel thread done."); 49*c566df45SLoGin 50*c566df45SLoGin return Ok(()); 51*c566df45SLoGin } 52*c566df45SLoGin 53*c566df45SLoGin #[inline(never)] 54*c566df45SLoGin fn kenrel_init_freeable() -> Result<(), SystemError> { 55*c566df45SLoGin do_initcalls().unwrap_or_else(|err| { 56*c566df45SLoGin panic!("Failed to initialize subsystems: {:?}", err); 57*c566df45SLoGin }); 58*c566df45SLoGin 59*c566df45SLoGin return Ok(()); 60*c566df45SLoGin } 61*c566df45SLoGin 62*c566df45SLoGin /// 切换到用户态 63*c566df45SLoGin fn switch_to_user() { 64*c566df45SLoGin let path = String::from("/bin/DragonReach"); 65*c566df45SLoGin let argv = vec![String::from("/bin/DragonReach")]; 66*c566df45SLoGin let envp = vec![String::from("PATH=/")]; 67*c566df45SLoGin 68*c566df45SLoGin unsafe { arch_switch_to_user(path, argv, envp) }; 69*c566df45SLoGin } 70