1#![allow(dead_code)]
2pub mod address;
15pub mod frame_allocator;
16pub mod global_allocator;
17pub mod memory_space;
18pub mod page_table;
19
20pub use frame_allocator::init_frame_allocator;
21pub use global_allocator::init_heap;
22
23use crate::arch::mm::vaddr_to_paddr;
24use crate::config::{MEMORY_END, PAGE_SIZE};
25use crate::mm::address::{Ppn, UsizeConvert};
26use crate::println;
27
28unsafe extern "C" {
29 fn ekernel();
31}
32
33pub fn init() {
40 let ekernel_paddr = unsafe { vaddr_to_paddr(ekernel as usize) };
44
45 let start = ekernel_paddr.div_ceil(PAGE_SIZE) * PAGE_SIZE; let end = MEMORY_END;
50
51 init_frame_allocator(start, end);
53
54 init_heap();
56
57 #[cfg(target_arch = "riscv64")]
59 {
60 use alloc::sync::Arc;
61
62 use crate::{
63 earlyprintln, kernel::current_cpu, mm::memory_space::MemorySpace, sync::SpinLock,
64 };
65
66 let old_satp: usize;
68 unsafe {
69 core::arch::asm!("csrr {0}, satp", out(reg) old_satp);
70 }
71 earlyprintln!("[MM] Before space switch - satp: 0x{:x}", old_satp);
72
73 let space = Arc::new(SpinLock::new(MemorySpace::new_kernel()));
74 let root_ppn = space.lock().root_ppn();
75 earlyprintln!(
76 "[MM] New kernel space root PPN: 0x{:x}",
77 root_ppn.as_usize()
78 );
79
80 current_cpu().lock().switch_space(space);
81
82 let new_satp: usize;
84 unsafe {
85 core::arch::asm!("csrr {0}, satp", out(reg) new_satp);
86 }
87 earlyprintln!("[MM] After space switch - satp: 0x{:x}", new_satp);
88 earlyprintln!(
89 "[MM] Expected satp: 0x{:x}",
90 (root_ppn.as_usize() | (8 << 60))
91 );
92 }
93}
94
95pub fn activate(root_ppn: Ppn) {
104 use crate::mm::page_table::PageTableInner as PageTableInnerTrait;
105 crate::arch::mm::PageTableInner::activate(root_ppn);
107}