init.rs 1.9 KB

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