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,