192849878SLoGin use core::intrinsics::unlikely; 292849878SLoGin 345626c85SLoGin use system_error::SystemError; 445626c85SLoGin 5*453452ccSLoGin use crate::libs::{ 6*453452ccSLoGin align::{page_align_down, page_align_up}, 7*453452ccSLoGin spinlock::{SpinLock, SpinLockGuard}, 8*453452ccSLoGin }; 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> { 56*453452ccSLoGin let r = self.add_range(base, size, MemoryAreaAttr::empty()); 57*453452ccSLoGin 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, 357*453452ccSLoGin mut base: PhysAddr, 358*453452ccSLoGin mut size: usize, 35992849878SLoGin set: bool, 36092849878SLoGin flags: MemoryAreaAttr, 36192849878SLoGin ) -> Result<(), SystemError> { 362*453452ccSLoGin let rsvd_base = PhysAddr::new(page_align_down(base.data())); 363*453452ccSLoGin size = page_align_up((size as usize) + base.data() - rsvd_base.data()); 364*453452ccSLoGin base = rsvd_base; 365*453452ccSLoGin 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 386*453452ccSLoGin /// 判断[base, base+size)与已有区域是否有重叠 387*453452ccSLoGin pub fn is_overlapped(&self, base: PhysAddr, size: usize) -> bool { 388*453452ccSLoGin let inner = self.inner.lock(); 389*453452ccSLoGin return self.do_is_overlapped(base, size, false, &inner); 390*453452ccSLoGin } 391*453452ccSLoGin 392*453452ccSLoGin /// 判断[base, base+size)与已有Reserved区域是否有重叠 393*453452ccSLoGin pub fn is_overlapped_with_reserved(&self, base: PhysAddr, size: usize) -> bool { 394*453452ccSLoGin let inner = self.inner.lock(); 395*453452ccSLoGin return self.do_is_overlapped(base, size, true, &inner); 396*453452ccSLoGin } 397*453452ccSLoGin 398*453452ccSLoGin fn do_is_overlapped( 399*453452ccSLoGin &self, 400*453452ccSLoGin base: PhysAddr, 401*453452ccSLoGin size: usize, 402*453452ccSLoGin require_reserved: bool, 403*453452ccSLoGin inner: &SpinLockGuard<'_, InnerMemBlockManager>, 404*453452ccSLoGin ) -> bool { 405*453452ccSLoGin let mut res = false; 406*453452ccSLoGin for i in 0..inner.initial_memory_regions_num { 407*453452ccSLoGin if require_reserved 408*453452ccSLoGin && !inner.initial_memory_regions[i] 409*453452ccSLoGin .flags 410*453452ccSLoGin .contains(MemoryAreaAttr::RESERVED) 411*453452ccSLoGin { 412*453452ccSLoGin // 忽略非保留区域 413*453452ccSLoGin continue; 414*453452ccSLoGin } 415*453452ccSLoGin 416*453452ccSLoGin let range_base = inner.initial_memory_regions[i].base; 417*453452ccSLoGin let range_end = range_base + inner.initial_memory_regions[i].size; 418*453452ccSLoGin if (base >= range_base && base < range_end) 419*453452ccSLoGin || (base + size > range_base && base + size <= range_end) 420*453452ccSLoGin || (base <= range_base && base + size >= range_end) 421*453452ccSLoGin { 422*453452ccSLoGin res = true; 423*453452ccSLoGin break; 424*453452ccSLoGin } 425*453452ccSLoGin } 426*453452ccSLoGin 427*453452ccSLoGin return res; 428*453452ccSLoGin } 429*453452ccSLoGin 43045626c85SLoGin /// 生成迭代器 43145626c85SLoGin pub fn to_iter(&self) -> MemBlockIter { 43245626c85SLoGin let inner = self.inner.lock(); 433*453452ccSLoGin return MemBlockIter { 434*453452ccSLoGin inner, 435*453452ccSLoGin index: 0, 436*453452ccSLoGin usable_only: false, 437*453452ccSLoGin }; 438*453452ccSLoGin } 439*453452ccSLoGin 440*453452ccSLoGin /// 生成迭代器,迭代所有可用的物理内存区域 441*453452ccSLoGin pub fn to_iter_available(&self) -> MemBlockIter { 442*453452ccSLoGin let inner = self.inner.lock(); 443*453452ccSLoGin return MemBlockIter { 444*453452ccSLoGin inner, 445*453452ccSLoGin index: 0, 446*453452ccSLoGin usable_only: true, 447*453452ccSLoGin }; 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, 466*453452ccSLoGin 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> { 491*453452ccSLoGin while self.index < self.inner.initial_memory_regions_num { 492*453452ccSLoGin if self.usable_only { 493*453452ccSLoGin if self.inner.initial_memory_regions[self.index] 494*453452ccSLoGin .flags 495*453452ccSLoGin .is_empty() 496*453452ccSLoGin == false 497*453452ccSLoGin { 498*453452ccSLoGin self.index += 1; 499*453452ccSLoGin if self.index >= self.inner.initial_memory_regions_num { 500*453452ccSLoGin return None; 501*453452ccSLoGin } 502*453452ccSLoGin continue; 503*453452ccSLoGin } 504*453452ccSLoGin } 505*453452ccSLoGin break; 506*453452ccSLoGin } 50745626c85SLoGin if self.index >= self.inner.initial_memory_regions_num { 50845626c85SLoGin return None; 50945626c85SLoGin } 51045626c85SLoGin let ret = self.inner.initial_memory_regions[self.index]; 51145626c85SLoGin self.index += 1; 51245626c85SLoGin return Some(ret); 51345626c85SLoGin } 51445626c85SLoGin } 51592849878SLoGin 51692849878SLoGin bitflags! { 51792849878SLoGin /// 内存区域属性 51892849878SLoGin pub struct MemoryAreaAttr: u32 { 51992849878SLoGin /// No special request 52092849878SLoGin const NONE = 0x0; 52192849878SLoGin /// Hotpluggable region 52292849878SLoGin const HOTPLUG = (1 << 0); 52392849878SLoGin /// Mirrored region 52492849878SLoGin const MIRROR = (1 << 1); 52592849878SLoGin /// do not add to kenrel direct mapping 52692849878SLoGin const NOMAP = (1 << 2); 52792849878SLoGin /// Always detected via a driver 52892849878SLoGin const DRIVER_MANAGED = (1 << 3); 52992849878SLoGin /// Memory is reserved 53092849878SLoGin const RESERVED = (1 << 4); 53192849878SLoGin } 53292849878SLoGin } 533