init.rs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. use crate::{
  2. arch::{
  3. init::{early_setup_arch, setup_arch, setup_arch_post},
  4. time::time_init,
  5. CurrentIrqArch, CurrentSMPArch, CurrentSchedArch,
  6. },
  7. driver::{base::init::driver_init, serial::serial_early_init, video::VideoRefreshManager},
  8. exception::{init::irq_init, softirq::softirq_init, InterruptArch},
  9. filesystem::vfs::core::vfs_init,
  10. include::bindings::bindings::acpi_init,
  11. init::init_intertrait,
  12. libs::{
  13. futex::futex::Futex,
  14. lib_ui::{
  15. screen_manager::{scm_init, scm_reinit},
  16. textui::textui_init,
  17. },
  18. },
  19. mm::init::mm_init,
  20. process::{kthread::kthread_init, process_init, ProcessManager},
  21. sched::SchedArch,
  22. smp::{early_smp_init, SMPArch},
  23. syscall::Syscall,
  24. time::{
  25. clocksource::clocksource_boot_finish, timekeeping::timekeeping_init, timer::timer_init,
  26. },
  27. };
  28. /// The entry point for the kernel
  29. ///
  30. /// 前面可能会有一个架构相关的函数
  31. pub fn start_kernel() -> ! {
  32. // 进入内核后,中断应该是关闭的
  33. assert!(!CurrentIrqArch::is_irq_enabled());
  34. do_start_kernel();
  35. CurrentSchedArch::initial_setup_sched_local();
  36. CurrentSchedArch::enable_sched_local();
  37. ProcessManager::arch_idle_func();
  38. }
  39. #[inline(never)]
  40. fn do_start_kernel() {
  41. init_before_mem_init();
  42. early_setup_arch().expect("setup_arch failed");
  43. unsafe { mm_init() };
  44. scm_reinit().unwrap();
  45. textui_init().unwrap();
  46. init_intertrait();
  47. vfs_init().expect("vfs init failed");
  48. driver_init().expect("driver init failed");
  49. #[cfg(target_arch = "x86_64")]
  50. unsafe {
  51. acpi_init()
  52. };
  53. crate::sched::sched_init();
  54. process_init();
  55. early_smp_init().expect("early smp init failed");
  56. irq_init().expect("irq init failed");
  57. setup_arch().expect("setup_arch failed");
  58. CurrentSMPArch::prepare_cpus().expect("prepare_cpus failed");
  59. // sched_init();
  60. softirq_init().expect("softirq init failed");
  61. Syscall::init().expect("syscall init failed");
  62. timekeeping_init();
  63. time_init();
  64. timer_init();
  65. kthread_init();
  66. clocksource_boot_finish();
  67. Futex::init();
  68. setup_arch_post().expect("setup_arch_post failed");
  69. #[cfg(all(target_arch = "x86_64", feature = "kvm"))]
  70. crate::virt::kvm::kvm_init();
  71. }
  72. /// 在内存管理初始化之前,执行的初始化
  73. #[inline(never)]
  74. fn init_before_mem_init() {
  75. serial_early_init().expect("serial early init failed");
  76. let video_ok = unsafe { VideoRefreshManager::video_init().is_ok() };
  77. scm_init(video_ok);
  78. }