DragonOS/kernel/src/init/initial_kthread.rs
LoGin 418ad41fd8
Feat(tty): add dummy console (#735)
使得riscv能暂时完成stdio_init(将来需要实现riscv的串口console)
2024-04-17 10:03:22 +08:00

72 lines
1.8 KiB
Rust

//! 这个文件内放置初始内核线程的代码。
use alloc::string::String;
use system_error::SystemError;
use crate::{
arch::process::arch_switch_to_user,
driver::{
disk::ahci::ahci_init, net::e1000e::e1000e::e1000e_init, virtio::virtio::virtio_probe,
},
filesystem::vfs::core::mount_root_fs,
kdebug, kerror,
net::net_core::net_init,
process::{kthread::KernelThreadMechanism, stdio::stdio_init},
smp::smp_init,
};
use super::initcall::do_initcalls;
pub fn initial_kernel_thread() -> i32 {
kernel_init().unwrap_or_else(|err| {
panic!("Failed to initialize kernel: {:?}", err);
});
switch_to_user();
unreachable!();
}
fn kernel_init() -> Result<(), SystemError> {
KernelThreadMechanism::init_stage2();
kenrel_init_freeable()?;
// 由于目前加锁,速度过慢,所以先不开启双缓冲
// scm_enable_double_buffer().expect("Failed to enable double buffer");
#[cfg(target_arch = "x86_64")]
ahci_init().expect("Failed to initialize AHCI");
mount_root_fs().expect("Failed to mount root fs");
virtio_probe();
e1000e_init();
net_init().unwrap_or_else(|err| {
kerror!("Failed to initialize network: {:?}", err);
});
kdebug!("initial kernel thread done.");
return Ok(());
}
#[inline(never)]
fn kenrel_init_freeable() -> Result<(), SystemError> {
do_initcalls().unwrap_or_else(|err| {
panic!("Failed to initialize subsystems: {:?}", err);
});
stdio_init().expect("Failed to initialize stdio");
smp_init();
return Ok(());
}
/// 切换到用户态
fn switch_to_user() {
let path = String::from("/bin/dragonreach");
let argv = vec![String::from("/bin/dragonreach")];
let envp = vec![String::from("PATH=/")];
unsafe { arch_switch_to_user(path, argv, envp) };
}