initial_kthread.rs 1.8 KB

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