diff --git a/ostd/src/mm/frame/meta.rs b/ostd/src/mm/frame/meta.rs index 53f782792..f3f9fc563 100644 --- a/ostd/src/mm/frame/meta.rs +++ b/ostd/src/mm/frame/meta.rs @@ -206,7 +206,7 @@ pub(super) fn get_slot(paddr: Paddr) -> Result<&'static MetaSlot, GetFrameError> if paddr % PAGE_SIZE != 0 { return Err(GetFrameError::NotAligned); } - if paddr >= super::MAX_PADDR.load(Ordering::Relaxed) as Paddr { + if paddr >= super::max_paddr() { return Err(GetFrameError::OutOfBound); } diff --git a/ostd/src/mm/frame/mod.rs b/ostd/src/mm/frame/mod.rs index 3ebcdea6d..b18fcb9cb 100644 --- a/ostd/src/mm/frame/mod.rs +++ b/ostd/src/mm/frame/mod.rs @@ -57,6 +57,13 @@ use crate::mm::{Paddr, PagingConsts, Vaddr}; static MAX_PADDR: AtomicUsize = AtomicUsize::new(0); +/// Returns the maximum physical address that is tracked by frame metadata. +pub(in crate::mm) fn max_paddr() -> Paddr { + let max_paddr = MAX_PADDR.load(Ordering::Relaxed) as Paddr; + debug_assert_ne!(max_paddr, 0); + max_paddr +} + /// A smart pointer to a frame. /// /// A frame is a contiguous range of bytes in physical memory. The [`Frame`] @@ -299,7 +306,7 @@ impl TryFrom> for UFrame { /// 2. The caller must have already held a reference to the frame. pub(in crate::mm) unsafe fn inc_frame_ref_count(paddr: Paddr) { debug_assert!(paddr % PAGE_SIZE == 0); - debug_assert!(paddr < MAX_PADDR.load(Ordering::Relaxed) as Paddr); + debug_assert!(paddr < max_paddr()); let vaddr: Vaddr = mapping::frame_to_meta::(paddr); // SAFETY: `vaddr` points to a valid `MetaSlot` that will never be mutably borrowed, so taking diff --git a/ostd/src/mm/frame/segment.rs b/ostd/src/mm/frame/segment.rs index 6bb2bed3f..d718f1846 100644 --- a/ostd/src/mm/frame/segment.rs +++ b/ostd/src/mm/frame/segment.rs @@ -2,7 +2,7 @@ //! A contiguous range of frames. -use core::{fmt::Debug, mem::ManuallyDrop, ops::Range, sync::atomic::Ordering}; +use core::{fmt::Debug, mem::ManuallyDrop, ops::Range}; use super::{ inc_frame_ref_count, @@ -90,7 +90,7 @@ impl Segment { if range.start % PAGE_SIZE != 0 || range.end % PAGE_SIZE != 0 { return Err(GetFrameError::NotAligned); } - if range.end > super::MAX_PADDR.load(Ordering::Relaxed) { + if range.end > super::max_paddr() { return Err(GetFrameError::OutOfBound); } assert!(range.start < range.end); diff --git a/ostd/src/mm/kspace/mod.rs b/ostd/src/mm/kspace/mod.rs index 21b5a511a..49356157f 100644 --- a/ostd/src/mm/kspace/mod.rs +++ b/ostd/src/mm/kspace/mod.rs @@ -40,7 +40,6 @@ pub(crate) mod kvirt_area; use core::ops::Range; -use align_ext::AlignExt; use log::info; use spin::Once; #[cfg(ktest)] @@ -134,9 +133,6 @@ pub static KERNEL_PAGE_TABLE: Once) { info!("Initializing the kernel page table"); - let regions = &crate::boot::EARLY_INFO.get().unwrap().memory_regions; - let phys_mem_cap = regions.iter().map(|r| r.base() + r.len()).max().unwrap(); - // Start to initialize the kernel page table. let kpt = PageTable::::empty(); @@ -148,8 +144,9 @@ pub fn init_kernel_page_table(meta_pages: Segment) { // Do linear mappings for the kernel. { - let from = LINEAR_MAPPING_BASE_VADDR..LINEAR_MAPPING_BASE_VADDR + phys_mem_cap; - let to = 0..phys_mem_cap; + let max_paddr = crate::mm::frame::max_paddr(); + let from = LINEAR_MAPPING_BASE_VADDR..LINEAR_MAPPING_BASE_VADDR + max_paddr; + let to = 0..max_paddr; let prop = PageProperty { flags: PageFlags::RW, cache: CachePolicy::Writeback, @@ -199,13 +196,13 @@ pub fn init_kernel_page_table(meta_pages: Segment) { // Map for the kernel code itself. // TODO: set separated permissions for each segments in the kernel. { + let regions = &crate::boot::EARLY_INFO.get().unwrap().memory_regions; let region = regions .iter() .find(|r| r.typ() == MemoryRegionType::Kernel) .unwrap(); let offset = kernel_loaded_offset(); - let to = - region.base().align_down(PAGE_SIZE)..(region.base() + region.len()).align_up(PAGE_SIZE); + let to = region.base()..region.end(); let from = to.start + offset..to.end + offset; let prop = PageProperty { flags: PageFlags::RWX,