diff --git a/ostd/src/mm/frame/meta.rs b/ostd/src/mm/frame/meta.rs index fb130a359..5b4e47b0f 100644 --- a/ostd/src/mm/frame/meta.rs +++ b/ostd/src/mm/frame/meta.rs @@ -53,6 +53,7 @@ use log::info; use crate::{ arch::mm::PagingConsts, + boot::memory_region::MemoryRegionType, const_assert, mm::{ frame::allocator::{self, EarlyAllocatedFrameMeta}, @@ -451,7 +452,12 @@ impl_frame_meta_for!(MetaPageMeta); pub(crate) unsafe fn init() -> Segment { let max_paddr = { let regions = &crate::boot::EARLY_INFO.get().unwrap().memory_regions; - regions.iter().map(|r| r.base() + r.len()).max().unwrap() + regions + .iter() + .filter(|r| r.typ() == MemoryRegionType::Usable) + .map(|r| r.base() + r.len()) + .max() + .unwrap() }; info!( @@ -567,8 +573,11 @@ macro_rules! mark_ranges { fn mark_unusable_ranges() { let regions = &crate::boot::EARLY_INFO.get().unwrap().memory_regions; - for region in regions.iter() { - use crate::boot::memory_region::MemoryRegionType; + for region in regions + .iter() + .rev() + .skip_while(|r| r.typ() != MemoryRegionType::Usable) + { match region.typ() { MemoryRegionType::BadMemory => mark_ranges!(region, UnusableMemoryMeta), MemoryRegionType::Unknown => mark_ranges!(region, UnusableMemoryMeta),