init.rs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. use core::{fmt::Write, sync::atomic::Ordering};
  2. use crate::{
  3. arch::MMArch,
  4. driver::serial::serial8250::send_to_default_serial8250_port,
  5. filesystem::procfs::kmsg::kmsg_init,
  6. ipc::shm::shm_manager_init,
  7. libs::printk::PrintkWriter,
  8. mm::{allocator::slab::slab_init, mmio_buddy::mmio_init, page::page_manager_init},
  9. };
  10. use super::MemoryManagementArch;
  11. #[atomic_enum]
  12. #[derive(PartialEq, Eq)]
  13. pub enum MMInitStatus {
  14. NotInit,
  15. Initializing,
  16. Initialized,
  17. }
  18. /// 内存管理的初始化状态
  19. static MM_INIT: AtomicMMInitStatus = AtomicMMInitStatus::new(MMInitStatus::NotInit);
  20. #[inline(never)]
  21. pub unsafe fn mm_init() {
  22. send_to_default_serial8250_port("mm_init\n\0".as_bytes());
  23. PrintkWriter
  24. .write_fmt(format_args!("mm_init() called\n"))
  25. .unwrap();
  26. // printk_color!(GREEN, BLACK, "mm_init() called\n");
  27. if MM_INIT
  28. .compare_exchange(
  29. MMInitStatus::NotInit,
  30. MMInitStatus::Initializing,
  31. Ordering::SeqCst,
  32. Ordering::SeqCst,
  33. )
  34. .is_err()
  35. {
  36. send_to_default_serial8250_port("mm_init err\n\0".as_bytes());
  37. panic!("mm_init() can only be called once");
  38. }
  39. MMArch::init();
  40. // init slab
  41. slab_init();
  42. // enable mmio
  43. mmio_init();
  44. // enable KMSG
  45. kmsg_init();
  46. // enable PAGE_MANAGER
  47. page_manager_init();
  48. // enable SHM_MANAGER
  49. shm_manager_init();
  50. MM_INIT
  51. .compare_exchange(
  52. MMInitStatus::Initializing,
  53. MMInitStatus::Initialized,
  54. Ordering::SeqCst,
  55. Ordering::SeqCst,
  56. )
  57. .unwrap();
  58. MMArch::arch_post_init();
  59. kinfo!("mm init done.");
  60. }
  61. /// 获取内存管理的初始化状态
  62. pub fn mm_init_status() -> MMInitStatus {
  63. MM_INIT.load(Ordering::SeqCst)
  64. }