xref: /DragonOS/kernel/src/mm/memblock.rs (revision 453452cc02e2766a28d87dd47bdee37caddc4c44)
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