xref: /DragonOS/kernel/src/init/initial_kthread.rs (revision c566df451ce6dbf2af684333e68b39fdfff86498)
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