init.rs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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::{
  8. acpi::acpi_init, base::init::driver_init, serial::serial_early_init,
  9. video::VideoRefreshManager,
  10. },
  11. exception::{init::irq_init, softirq::softirq_init, InterruptArch},
  12. filesystem::vfs::core::vfs_init,
  13. init::init_intertrait,
  14. libs::{
  15. futex::futex::Futex,
  16. lib_ui::{
  17. screen_manager::{scm_init, scm_reinit},
  18. textui::textui_init,
  19. },
  20. printk::early_init_logging,
  21. },
  22. mm::init::mm_init,
  23. process::{kthread::kthread_init, process_init, ProcessManager},
  24. sched::SchedArch,
  25. smp::{early_smp_init, SMPArch},
  26. syscall::Syscall,
  27. time::{
  28. clocksource::clocksource_boot_finish, timekeeping::timekeeping_init, timer::timer_init,
  29. },
  30. };
  31. use log::warn;
  32. use super::{
  33. boot::{boot_callback_except_early, boot_callbacks},
  34. cmdline::kenrel_cmdline_param_manager,
  35. };
  36. /// The entry point for the kernel
  37. ///
  38. /// 前面可能会有一个架构相关的函数
  39. pub fn start_kernel() -> ! {
  40. // 进入内核后,中断应该是关闭的
  41. assert!(!CurrentIrqArch::is_irq_enabled());
  42. do_start_kernel();
  43. CurrentSchedArch::initial_setup_sched_local();
  44. CurrentSchedArch::enable_sched_local();
  45. ProcessManager::arch_idle_func();
  46. }
  47. #[inline(never)]
  48. fn do_start_kernel() {
  49. init_before_mem_init();
  50. unsafe { mm_init() };
  51. // crate::debug::jump_label::static_keys_init();
  52. if scm_reinit().is_ok() {
  53. if let Err(e) = textui_init() {
  54. warn!("Failed to init textui: {:?}", e);
  55. }
  56. }
  57. // 初始化内核命令行参数
  58. kenrel_cmdline_param_manager().init();
  59. boot_callback_except_early();
  60. init_intertrait();
  61. vfs_init().expect("vfs init failed");
  62. driver_init().expect("driver init failed");
  63. acpi_init().expect("acpi init failed");
  64. crate::sched::sched_init();
  65. process_init();
  66. early_smp_init().expect("early smp init failed");
  67. irq_init().expect("irq init failed");
  68. setup_arch().expect("setup_arch failed");
  69. CurrentSMPArch::prepare_cpus().expect("prepare_cpus failed");
  70. // sched_init();
  71. softirq_init().expect("softirq init failed");
  72. Syscall::init().expect("syscall init failed");
  73. timekeeping_init();
  74. time_init();
  75. timer_init();
  76. kthread_init();
  77. setup_arch_post().expect("setup_arch_post failed");
  78. clocksource_boot_finish();
  79. Futex::init();
  80. crate::bpf::init_bpf_system();
  81. crate::debug::jump_label::static_keys_init();
  82. #[cfg(all(target_arch = "x86_64", feature = "kvm"))]
  83. if crate::arch::vm::vmx::vmx_init().is_err() {
  84. log::warn!("vmx init failed, will not be enabled");
  85. }
  86. }
  87. /// 在内存管理初始化之前,执行的初始化
  88. #[inline(never)]
  89. fn init_before_mem_init() {
  90. serial_early_init().expect("serial early init failed");
  91. let video_ok = unsafe { VideoRefreshManager::video_init().is_ok() };
  92. scm_init(video_ok);
  93. early_init_logging();
  94. early_setup_arch().expect("setup_arch failed");
  95. boot_callbacks()
  96. .init_kernel_cmdline()
  97. .inspect_err(|e| {
  98. log::error!("Failed to init kernel cmdline: {:?}", e);
  99. })
  100. .ok();
  101. kenrel_cmdline_param_manager().early_init();
  102. }