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