192849878SLoGin use core::intrinsics::unlikely; 292849878SLoGin 345626c85SLoGin use system_error::SystemError; 445626c85SLoGin 5453452ccSLoGin use crate::libs::{ 6453452ccSLoGin align::{page_align_down, page_align_up}, 7453452ccSLoGin spinlock::{SpinLock, SpinLockGuard}, 8453452ccSLoGin }; 945626c85SLoGin 1045626c85SLoGin use super::{PhysAddr, PhysMemoryArea}; 1145626c85SLoGin 1245626c85SLoGin pub const INITIAL_MEMORY_REGIONS_NUM: usize = 128; 1345626c85SLoGin 1445626c85SLoGin /// 初始内存区域 1545626c85SLoGin static MEM_BLOCK_MANAGER: MemBlockManager = MemBlockManager::new(); 1645626c85SLoGin 1745626c85SLoGin #[inline(always)] 1845626c85SLoGin pub fn mem_block_manager() -> &'static MemBlockManager { 1945626c85SLoGin &MEM_BLOCK_MANAGER 2045626c85SLoGin } 2145626c85SLoGin 2245626c85SLoGin /// 内存区域管理器 2345626c85SLoGin #[derive(Debug)] 2445626c85SLoGin pub struct MemBlockManager { 2545626c85SLoGin inner: SpinLock<InnerMemBlockManager>, 2645626c85SLoGin } 2745626c85SLoGin 2845626c85SLoGin #[derive(Debug)] 2945626c85SLoGin pub struct InnerMemBlockManager { 3045626c85SLoGin /// 初始内存区域 3145626c85SLoGin /// 3245626c85SLoGin /// 用于记录内核启动时的内存布局, 这些区域保持升序、不重叠 3345626c85SLoGin initial_memory_regions: [PhysMemoryArea; INITIAL_MEMORY_REGIONS_NUM], 3445626c85SLoGin initial_memory_regions_num: usize, 3545626c85SLoGin } 3645626c85SLoGin 3745626c85SLoGin impl MemBlockManager { 3845626c85SLoGin #[allow(dead_code)] 3945626c85SLoGin pub const MIN_MEMBLOCK_ADDR: PhysAddr = PhysAddr::new(0); 4045626c85SLoGin #[allow(dead_code)] 4145626c85SLoGin pub const MAX_MEMBLOCK_ADDR: PhysAddr = PhysAddr::new(usize::MAX); 4245626c85SLoGin const fn new() -> Self { 4345626c85SLoGin Self { 4445626c85SLoGin inner: SpinLock::new(InnerMemBlockManager { 4545626c85SLoGin initial_memory_regions: [PhysMemoryArea::DEFAULT; INITIAL_MEMORY_REGIONS_NUM], 4645626c85SLoGin initial_memory_regions_num: 0, 4745626c85SLoGin }), 4845626c85SLoGin } 4945626c85SLoGin } 5045626c85SLoGin 5145626c85SLoGin /// 添加内存区域 5245626c85SLoGin /// 5345626c85SLoGin /// 如果添加的区域与已有区域有重叠,会将重叠的区域合并 5445626c85SLoGin #[allow(dead_code)] 5545626c85SLoGin pub fn add_block(&self, base: PhysAddr, size: usize) -> Result<(), SystemError> { 56453452ccSLoGin let r = self.add_range(base, size, MemoryAreaAttr::empty()); 57453452ccSLoGin return r; 5892849878SLoGin } 5992849878SLoGin 6092849878SLoGin /// 添加内存区域 6192849878SLoGin /// 6292849878SLoGin /// 如果添加的区域与已有区域有重叠,会将重叠的区域合并 6392849878SLoGin fn add_range( 6492849878SLoGin &self, 6592849878SLoGin base: PhysAddr, 6692849878SLoGin size: usize, 6792849878SLoGin flags: MemoryAreaAttr, 6892849878SLoGin ) -> Result<(), SystemError> { 6945626c85SLoGin if size == 0 { 7045626c85SLoGin return Ok(()); 7145626c85SLoGin } 7245626c85SLoGin let mut inner = self.inner.lock(); 7345626c85SLoGin if inner.initial_memory_regions_num >= INITIAL_MEMORY_REGIONS_NUM { 7445626c85SLoGin panic!("Too many memory regions!"); 7545626c85SLoGin } 7645626c85SLoGin 7792849878SLoGin let block = PhysMemoryArea::new(base, size, MemoryAreaAttr::empty()); 7845626c85SLoGin // 特判第一个区域 7945626c85SLoGin if inner.initial_memory_regions_num == 0 { 8045626c85SLoGin inner.initial_memory_regions[0] = block; 8145626c85SLoGin inner.initial_memory_regions_num += 1; 8245626c85SLoGin return Ok(()); 8345626c85SLoGin } 8445626c85SLoGin 8545626c85SLoGin // 先计算需要添加的区域数量 8645626c85SLoGin let blocks_to_add = self 8792849878SLoGin .do_add_block(&mut inner, block, false, flags) 8845626c85SLoGin .expect("Failed to count blocks to add!"); 8945626c85SLoGin 9045626c85SLoGin if inner.initial_memory_regions_num + blocks_to_add > INITIAL_MEMORY_REGIONS_NUM { 9145626c85SLoGin kerror!("Too many memory regions!"); 9245626c85SLoGin return Err(SystemError::ENOMEM); 9345626c85SLoGin } 9445626c85SLoGin 9545626c85SLoGin // 然后添加区域 9692849878SLoGin self.do_add_block(&mut inner, block, true, flags) 9745626c85SLoGin .expect("Failed to add block!"); 9845626c85SLoGin 9945626c85SLoGin return Ok(()); 10045626c85SLoGin } 10145626c85SLoGin 10245626c85SLoGin fn do_add_block( 10345626c85SLoGin &self, 10445626c85SLoGin inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, 10545626c85SLoGin block: PhysMemoryArea, 10645626c85SLoGin insert: bool, 10792849878SLoGin flags: MemoryAreaAttr, 10845626c85SLoGin ) -> Result<usize, SystemError> { 10945626c85SLoGin let mut base = block.base; 11045626c85SLoGin let end = block.base + block.size; 11145626c85SLoGin let mut i = 0; 11245626c85SLoGin let mut start_index = -1; 11345626c85SLoGin let mut end_index = -1; 11445626c85SLoGin 11545626c85SLoGin let mut num_to_add = 0; 11645626c85SLoGin 11745626c85SLoGin while i < inner.initial_memory_regions_num { 11845626c85SLoGin let range_base = inner.initial_memory_regions[i].base; 11945626c85SLoGin let range_end = 12045626c85SLoGin inner.initial_memory_regions[i].base + inner.initial_memory_regions[i].size; 12145626c85SLoGin 12245626c85SLoGin if range_base >= end { 12345626c85SLoGin break; 12445626c85SLoGin } 12545626c85SLoGin if range_end <= base { 12645626c85SLoGin i += 1; 12745626c85SLoGin continue; 12845626c85SLoGin } 12945626c85SLoGin 13045626c85SLoGin // 有重叠 13145626c85SLoGin 13245626c85SLoGin if range_base > base { 13345626c85SLoGin num_to_add += 1; 13445626c85SLoGin if insert { 13545626c85SLoGin if start_index == -1 { 13645626c85SLoGin start_index = i as isize; 13745626c85SLoGin } 13845626c85SLoGin end_index = (i + 1) as isize; 13992849878SLoGin self.do_insert_area(inner, i, base, range_base - base, flags); 14045626c85SLoGin i += 1; 14145626c85SLoGin } 14245626c85SLoGin } 14345626c85SLoGin 14445626c85SLoGin i += 1; 14545626c85SLoGin base = core::cmp::min(range_end, end); 14645626c85SLoGin } 14745626c85SLoGin 14845626c85SLoGin if base < end { 14945626c85SLoGin num_to_add += 1; 15045626c85SLoGin if insert { 15145626c85SLoGin if start_index == -1 { 15245626c85SLoGin start_index = i as isize; 15345626c85SLoGin } 15445626c85SLoGin end_index = (i + 1) as isize; 15592849878SLoGin self.do_insert_area(inner, i, base, end - base, flags); 15645626c85SLoGin } 15745626c85SLoGin } 15845626c85SLoGin 15945626c85SLoGin if num_to_add == 0 { 16045626c85SLoGin return Ok(0); 16145626c85SLoGin } 16245626c85SLoGin 16345626c85SLoGin if insert { 16445626c85SLoGin self.do_merge_blocks(inner, start_index, end_index); 16545626c85SLoGin } 16645626c85SLoGin return Ok(num_to_add); 16745626c85SLoGin } 16845626c85SLoGin 16945626c85SLoGin fn do_insert_area( 17045626c85SLoGin &self, 17145626c85SLoGin inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, 17245626c85SLoGin index: usize, 17345626c85SLoGin base: PhysAddr, 17445626c85SLoGin size: usize, 17592849878SLoGin flags: MemoryAreaAttr, 17645626c85SLoGin ) { 17745626c85SLoGin let copy_elements = inner.initial_memory_regions_num - index; 17845626c85SLoGin inner 17945626c85SLoGin .initial_memory_regions 18045626c85SLoGin .copy_within(index..index + copy_elements, index + 1); 18192849878SLoGin inner.initial_memory_regions[index] = PhysMemoryArea::new(base, size, flags); 18245626c85SLoGin inner.initial_memory_regions_num += 1; 18345626c85SLoGin } 18445626c85SLoGin 18545626c85SLoGin fn do_merge_blocks( 18645626c85SLoGin &self, 18745626c85SLoGin inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, 18845626c85SLoGin start_index: isize, 18945626c85SLoGin mut end_index: isize, 19045626c85SLoGin ) { 19145626c85SLoGin let mut i = 0; 19245626c85SLoGin if start_index > 0 { 19345626c85SLoGin i = start_index - 1; 19445626c85SLoGin } 19545626c85SLoGin end_index = core::cmp::min(end_index, inner.initial_memory_regions_num as isize - 1); 19645626c85SLoGin 19745626c85SLoGin while i < end_index { 19845626c85SLoGin { 19945626c85SLoGin let next_base = inner.initial_memory_regions[(i + 1) as usize].base; 20045626c85SLoGin let next_size = inner.initial_memory_regions[(i + 1) as usize].size; 20192849878SLoGin let next_flags = inner.initial_memory_regions[(i + 1) as usize].flags; 20245626c85SLoGin let this = &mut inner.initial_memory_regions[i as usize]; 20345626c85SLoGin 20492849878SLoGin if this.base + this.size != next_base || this.flags != next_flags { 20592849878SLoGin if unlikely(this.base + this.size > next_base) { 20692849878SLoGin kBUG!("this->base + this->size > next->base"); 20792849878SLoGin } 20845626c85SLoGin i += 1; 20945626c85SLoGin continue; 21045626c85SLoGin } 21145626c85SLoGin this.size += next_size; 21245626c85SLoGin } 21345626c85SLoGin // 移动后面的区域 21445626c85SLoGin let copy_elements = inner.initial_memory_regions_num - (i + 2) as usize; 21545626c85SLoGin inner.initial_memory_regions.copy_within( 21645626c85SLoGin (i + 2) as usize..(i as usize + 2 + copy_elements), 21745626c85SLoGin (i + 1) as usize, 21845626c85SLoGin ); 21945626c85SLoGin 22045626c85SLoGin inner.initial_memory_regions_num -= 1; 22145626c85SLoGin end_index -= 1; 22245626c85SLoGin } 22345626c85SLoGin } 22445626c85SLoGin 22545626c85SLoGin /// 移除内存区域 22645626c85SLoGin /// 22745626c85SLoGin /// 如果移除的区域与已有区域有重叠,会将重叠的区域分割 22845626c85SLoGin #[allow(dead_code)] 22945626c85SLoGin pub fn remove_block(&self, base: PhysAddr, size: usize) -> Result<(), SystemError> { 23045626c85SLoGin if size == 0 { 23145626c85SLoGin return Ok(()); 23245626c85SLoGin } 23345626c85SLoGin let mut inner = self.inner.lock(); 23445626c85SLoGin if inner.initial_memory_regions_num == 0 { 23545626c85SLoGin return Ok(()); 23645626c85SLoGin } 23745626c85SLoGin 23845626c85SLoGin let (start_index, end_index) = self 23945626c85SLoGin .isolate_range(&mut inner, base, size) 24045626c85SLoGin .expect("Failed to isolate range!"); 24145626c85SLoGin 24245626c85SLoGin for i in (start_index..end_index).rev() { 24345626c85SLoGin self.do_remove_region(&mut inner, i); 24445626c85SLoGin } 24545626c85SLoGin return Ok(()); 24645626c85SLoGin } 24745626c85SLoGin 24845626c85SLoGin fn do_remove_region(&self, inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, index: usize) { 24945626c85SLoGin let copy_elements = inner.initial_memory_regions_num - index - 1; 25045626c85SLoGin inner 25145626c85SLoGin .initial_memory_regions 25245626c85SLoGin .copy_within(index + 1..index + 1 + copy_elements, index); 25345626c85SLoGin 25445626c85SLoGin inner.initial_memory_regions_num -= 1; 25545626c85SLoGin 25645626c85SLoGin if inner.initial_memory_regions_num == 0 { 25745626c85SLoGin inner.initial_memory_regions[0].base = PhysAddr::new(0); 25845626c85SLoGin inner.initial_memory_regions[0].size = 0; 25945626c85SLoGin } 26045626c85SLoGin } 26145626c85SLoGin 26292849878SLoGin /// 在一个内存块管理器中找到一个物理地址范围内的 26392849878SLoGin /// 空闲块,并隔离出所需的内存大小 26492849878SLoGin /// 26592849878SLoGin /// ## 返回值 26692849878SLoGin /// 26792849878SLoGin /// - Ok((start_index, end_index)) 表示成功找到了一个连续的内存区域来满足所需的 size。这里: 26892849878SLoGin /// - start_index 是指定的起始内存区域的索引。 26992849878SLoGin /// - end_index 是指定的结束内存区域的索引,它实际上不包含在返回的连续区域中,但它标志着下一个可能的不连续区域的开始。 27092849878SLoGin /// - Err(SystemError) 则表示没有找到足够的空间来满足请求的 size,可能是因为内存区域不足或存在其他系统错误 27145626c85SLoGin fn isolate_range( 27245626c85SLoGin &self, 27345626c85SLoGin inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, 27445626c85SLoGin base: PhysAddr, 27545626c85SLoGin size: usize, 27645626c85SLoGin ) -> Result<(usize, usize), SystemError> { 27745626c85SLoGin let end = base + size; 27845626c85SLoGin 27945626c85SLoGin let mut idx = 0; 28045626c85SLoGin 28145626c85SLoGin let mut start_index = 0; 28245626c85SLoGin let mut end_index = 0; 28345626c85SLoGin 28445626c85SLoGin if size == 0 { 28545626c85SLoGin return Ok((0, 0)); 28645626c85SLoGin } 28745626c85SLoGin 28845626c85SLoGin while idx < inner.initial_memory_regions_num { 28945626c85SLoGin let range_base = inner.initial_memory_regions[idx].base; 29045626c85SLoGin let range_end = range_base + inner.initial_memory_regions[idx].size; 29145626c85SLoGin 29245626c85SLoGin if range_base >= end { 29345626c85SLoGin break; 29445626c85SLoGin } 29545626c85SLoGin if range_end <= base { 29645626c85SLoGin idx = idx.checked_add(1).unwrap_or(0); 29745626c85SLoGin continue; 29845626c85SLoGin } 29945626c85SLoGin 30045626c85SLoGin if range_base < base { 30145626c85SLoGin // regions[idx] intersects from below 30245626c85SLoGin inner.initial_memory_regions[idx].base = base; 30345626c85SLoGin inner.initial_memory_regions[idx].size -= base - range_base; 30492849878SLoGin self.do_insert_area( 30592849878SLoGin inner, 30692849878SLoGin idx, 30792849878SLoGin range_base, 30892849878SLoGin base - range_base, 30992849878SLoGin inner.initial_memory_regions[idx].flags, 31092849878SLoGin ); 31145626c85SLoGin } else if range_end > end { 31245626c85SLoGin // regions[idx] intersects from above 31345626c85SLoGin inner.initial_memory_regions[idx].base = end; 31445626c85SLoGin inner.initial_memory_regions[idx].size -= end - range_base; 31545626c85SLoGin 31692849878SLoGin self.do_insert_area( 31792849878SLoGin inner, 31892849878SLoGin idx, 31992849878SLoGin range_base, 32092849878SLoGin end - range_base, 32192849878SLoGin inner.initial_memory_regions[idx].flags, 32292849878SLoGin ); 32345626c85SLoGin if idx == 0 { 32445626c85SLoGin idx = usize::MAX; 32545626c85SLoGin } else { 32645626c85SLoGin idx -= 1; 32745626c85SLoGin } 32845626c85SLoGin } else { 32945626c85SLoGin // regions[idx] is inside the range, record it 33045626c85SLoGin if end_index == 0 { 33145626c85SLoGin start_index = idx; 33245626c85SLoGin } 33345626c85SLoGin end_index = idx + 1; 33445626c85SLoGin } 33545626c85SLoGin 33645626c85SLoGin idx = idx.checked_add(1).unwrap_or(0); 33745626c85SLoGin } 33845626c85SLoGin 33945626c85SLoGin return Ok((start_index, end_index)); 34045626c85SLoGin } 34145626c85SLoGin 34292849878SLoGin /// mark_nomap - 用`MemoryAreaAttr::NOMAP`标志标记内存区域 34392849878SLoGin /// 34492849878SLoGin /// ## 参数 34592849878SLoGin /// 34692849878SLoGin /// - base: 区域的物理基地址 34792849878SLoGin /// - size: 区域的大小 34892849878SLoGin /// 34992849878SLoGin /// 使用`MemoryAreaAttr::NOMAP`标志标记的内存区域将不会被添加到物理内存的直接映射中。这些区域仍然会被内存映射所覆盖。内存映射中代表NOMAP内存帧的struct page将被PageReserved()。 35092849878SLoGin /// 注意:如果被标记为`MemoryAreaAttr::NOMAP`的内存是从memblock分配的,调用者必须忽略该内存 35192849878SLoGin pub fn mark_nomap(&self, base: PhysAddr, size: usize) -> Result<(), SystemError> { 35292849878SLoGin return self.set_or_clear_flags(base, size, true, MemoryAreaAttr::NOMAP); 35392849878SLoGin } 35492849878SLoGin 35592849878SLoGin fn set_or_clear_flags( 35692849878SLoGin &self, 357453452ccSLoGin mut base: PhysAddr, 358453452ccSLoGin mut size: usize, 35992849878SLoGin set: bool, 36092849878SLoGin flags: MemoryAreaAttr, 36192849878SLoGin ) -> Result<(), SystemError> { 362453452ccSLoGin let rsvd_base = PhysAddr::new(page_align_down(base.data())); 363*b5b571e0SLoGin size = page_align_up(size + base.data() - rsvd_base.data()); 364453452ccSLoGin base = rsvd_base; 365453452ccSLoGin 36692849878SLoGin let mut inner = self.inner.lock(); 36792849878SLoGin let (start_index, end_index) = self.isolate_range(&mut inner, base, size)?; 36892849878SLoGin for i in start_index..end_index { 36992849878SLoGin if set { 37092849878SLoGin inner.initial_memory_regions[i].flags |= flags; 37192849878SLoGin } else { 37292849878SLoGin inner.initial_memory_regions[i].flags &= !flags; 37392849878SLoGin } 37492849878SLoGin } 37592849878SLoGin 37692849878SLoGin let num = inner.initial_memory_regions_num as isize; 37792849878SLoGin self.do_merge_blocks(&mut inner, 0, num); 37892849878SLoGin return Ok(()); 37992849878SLoGin } 38092849878SLoGin 38192849878SLoGin /// 标记内存区域为保留区域 38292849878SLoGin pub fn reserve_block(&self, base: PhysAddr, size: usize) -> Result<(), SystemError> { 38392849878SLoGin return self.set_or_clear_flags(base, size, true, MemoryAreaAttr::RESERVED); 38492849878SLoGin } 38592849878SLoGin 386453452ccSLoGin /// 判断[base, base+size)与已有区域是否有重叠 387453452ccSLoGin pub fn is_overlapped(&self, base: PhysAddr, size: usize) -> bool { 388453452ccSLoGin let inner = self.inner.lock(); 389453452ccSLoGin return self.do_is_overlapped(base, size, false, &inner); 390453452ccSLoGin } 391453452ccSLoGin 392453452ccSLoGin /// 判断[base, base+size)与已有Reserved区域是否有重叠 393453452ccSLoGin pub fn is_overlapped_with_reserved(&self, base: PhysAddr, size: usize) -> bool { 394453452ccSLoGin let inner = self.inner.lock(); 395453452ccSLoGin return self.do_is_overlapped(base, size, true, &inner); 396453452ccSLoGin } 397453452ccSLoGin 398453452ccSLoGin fn do_is_overlapped( 399453452ccSLoGin &self, 400453452ccSLoGin base: PhysAddr, 401453452ccSLoGin size: usize, 402453452ccSLoGin require_reserved: bool, 403453452ccSLoGin inner: &SpinLockGuard<'_, InnerMemBlockManager>, 404453452ccSLoGin ) -> bool { 405453452ccSLoGin let mut res = false; 406453452ccSLoGin for i in 0..inner.initial_memory_regions_num { 407453452ccSLoGin if require_reserved 408453452ccSLoGin && !inner.initial_memory_regions[i] 409453452ccSLoGin .flags 410453452ccSLoGin .contains(MemoryAreaAttr::RESERVED) 411453452ccSLoGin { 412453452ccSLoGin // 忽略非保留区域 413453452ccSLoGin continue; 414453452ccSLoGin } 415453452ccSLoGin 416453452ccSLoGin let range_base = inner.initial_memory_regions[i].base; 417453452ccSLoGin let range_end = range_base + inner.initial_memory_regions[i].size; 418453452ccSLoGin if (base >= range_base && base < range_end) 419453452ccSLoGin || (base + size > range_base && base + size <= range_end) 420453452ccSLoGin || (base <= range_base && base + size >= range_end) 421453452ccSLoGin { 422453452ccSLoGin res = true; 423453452ccSLoGin break; 424453452ccSLoGin } 425453452ccSLoGin } 426453452ccSLoGin 427453452ccSLoGin return res; 428453452ccSLoGin } 429453452ccSLoGin 43045626c85SLoGin /// 生成迭代器 43145626c85SLoGin pub fn to_iter(&self) -> MemBlockIter { 43245626c85SLoGin let inner = self.inner.lock(); 433453452ccSLoGin return MemBlockIter { 434453452ccSLoGin inner, 435453452ccSLoGin index: 0, 436453452ccSLoGin usable_only: false, 437453452ccSLoGin }; 438453452ccSLoGin } 439453452ccSLoGin 440453452ccSLoGin /// 生成迭代器,迭代所有可用的物理内存区域 441453452ccSLoGin pub fn to_iter_available(&self) -> MemBlockIter { 442453452ccSLoGin let inner = self.inner.lock(); 443453452ccSLoGin return MemBlockIter { 444453452ccSLoGin inner, 445453452ccSLoGin index: 0, 446453452ccSLoGin usable_only: true, 447453452ccSLoGin }; 44845626c85SLoGin } 44945626c85SLoGin 45045626c85SLoGin /// 获取初始内存区域数量 45145626c85SLoGin pub fn total_initial_memory_regions(&self) -> usize { 45245626c85SLoGin let inner = self.inner.lock(); 45345626c85SLoGin return inner.initial_memory_regions_num; 45445626c85SLoGin } 45545626c85SLoGin 45645626c85SLoGin /// 根据索引获取初始内存区域 45745626c85SLoGin pub fn get_initial_memory_region(&self, index: usize) -> Option<PhysMemoryArea> { 45845626c85SLoGin let inner = self.inner.lock(); 45945626c85SLoGin return inner.initial_memory_regions.get(index).copied(); 46045626c85SLoGin } 46145626c85SLoGin } 46245626c85SLoGin 46345626c85SLoGin pub struct MemBlockIter<'a> { 46445626c85SLoGin inner: SpinLockGuard<'a, InnerMemBlockManager>, 46545626c85SLoGin index: usize, 466453452ccSLoGin usable_only: bool, 46745626c85SLoGin } 46845626c85SLoGin 46945626c85SLoGin #[allow(dead_code)] 47045626c85SLoGin impl<'a> MemBlockIter<'a> { 47145626c85SLoGin /// 获取内存区域数量 47245626c85SLoGin pub fn total_num(&self) -> usize { 47345626c85SLoGin self.inner.initial_memory_regions_num 47445626c85SLoGin } 47545626c85SLoGin 47645626c85SLoGin /// 获取指定索引的内存区域 47745626c85SLoGin pub fn get_area(&self, index: usize) -> &PhysMemoryArea { 47845626c85SLoGin &self.inner.initial_memory_regions[index] 47945626c85SLoGin } 48045626c85SLoGin 48145626c85SLoGin /// 获取当前索引 48245626c85SLoGin pub fn current_index(&self) -> usize { 48345626c85SLoGin self.index 48445626c85SLoGin } 48545626c85SLoGin } 48645626c85SLoGin 48745626c85SLoGin impl<'a> Iterator for MemBlockIter<'a> { 48845626c85SLoGin type Item = PhysMemoryArea; 48945626c85SLoGin 49045626c85SLoGin fn next(&mut self) -> Option<Self::Item> { 491453452ccSLoGin while self.index < self.inner.initial_memory_regions_num { 492*b5b571e0SLoGin if self.usable_only 493*b5b571e0SLoGin && !self.inner.initial_memory_regions[self.index] 494453452ccSLoGin .flags 495453452ccSLoGin .is_empty() 496453452ccSLoGin { 497453452ccSLoGin self.index += 1; 498453452ccSLoGin if self.index >= self.inner.initial_memory_regions_num { 499453452ccSLoGin return None; 500453452ccSLoGin } 501453452ccSLoGin continue; 502453452ccSLoGin } 503453452ccSLoGin break; 504453452ccSLoGin } 50545626c85SLoGin if self.index >= self.inner.initial_memory_regions_num { 50645626c85SLoGin return None; 50745626c85SLoGin } 50845626c85SLoGin let ret = self.inner.initial_memory_regions[self.index]; 50945626c85SLoGin self.index += 1; 51045626c85SLoGin return Some(ret); 51145626c85SLoGin } 51245626c85SLoGin } 51392849878SLoGin 51492849878SLoGin bitflags! { 51592849878SLoGin /// 内存区域属性 516*b5b571e0SLoGin #[allow(clippy::bad_bit_mask)] 51792849878SLoGin pub struct MemoryAreaAttr: u32 { 51892849878SLoGin /// No special request 51992849878SLoGin const NONE = 0x0; 52092849878SLoGin /// Hotpluggable region 52192849878SLoGin const HOTPLUG = (1 << 0); 52292849878SLoGin /// Mirrored region 52392849878SLoGin const MIRROR = (1 << 1); 52492849878SLoGin /// do not add to kenrel direct mapping 52592849878SLoGin const NOMAP = (1 << 2); 52692849878SLoGin /// Always detected via a driver 52792849878SLoGin const DRIVER_MANAGED = (1 << 3); 52892849878SLoGin /// Memory is reserved 52992849878SLoGin const RESERVED = (1 << 4); 53092849878SLoGin } 53192849878SLoGin } 532