1 use core::{fmt::Write, sync::atomic::Ordering}; 2 3 use crate::{ 4 arch::MMArch, driver::tty::serial::serial8250::send_to_default_serial8250_port, 5 filesystem::procfs::kmsg::kmsg_init, libs::printk::PrintkWriter, mm::mmio_buddy::mmio_init, 6 }; 7 8 use super::MemoryManagementArch; 9 10 #[atomic_enum] 11 #[derive(PartialEq, Eq)] 12 pub enum MMInitStatus { 13 NotInit, 14 Initializing, 15 Initialized, 16 } 17 /// 内存管理的初始化状态 18 static MM_INIT: AtomicMMInitStatus = AtomicMMInitStatus::new(MMInitStatus::NotInit); 19 20 pub unsafe fn mm_init() { 21 send_to_default_serial8250_port("mm_init\n\0".as_bytes()); 22 PrintkWriter 23 .write_fmt(format_args!("mm_init() called\n")) 24 .unwrap(); 25 // printk_color!(GREEN, BLACK, "mm_init() called\n"); 26 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 40 MMArch::init(); 41 42 // enable mmio 43 mmio_init(); 44 // enable KMSG 45 kmsg_init(); 46 47 MM_INIT 48 .compare_exchange( 49 MMInitStatus::Initializing, 50 MMInitStatus::Initialized, 51 Ordering::SeqCst, 52 Ordering::SeqCst, 53 ) 54 .unwrap(); 55 kinfo!("mm init done."); 56 } 57 58 /// 获取内存管理的初始化状态 59 pub fn mm_init_status() -> MMInitStatus { 60 MM_INIT.load(Ordering::SeqCst) 61 } 62