192849878SLoGin use core::intrinsics::unlikely;
292849878SLoGin
3*2eab6dd7S曾俊 use log::error;
445626c85SLoGin use system_error::SystemError;
545626c85SLoGin
6453452ccSLoGin use crate::libs::{
7453452ccSLoGin align::{page_align_down, page_align_up},
8453452ccSLoGin spinlock::{SpinLock, SpinLockGuard},
9453452ccSLoGin };
1045626c85SLoGin
1145626c85SLoGin use super::{PhysAddr, PhysMemoryArea};
1245626c85SLoGin
1345626c85SLoGin pub const INITIAL_MEMORY_REGIONS_NUM: usize = 128;
1445626c85SLoGin
1545626c85SLoGin /// 初始内存区域
1645626c85SLoGin static MEM_BLOCK_MANAGER: MemBlockManager = MemBlockManager::new();
1745626c85SLoGin
1845626c85SLoGin #[inline(always)]
mem_block_manager() -> &'static MemBlockManager1945626c85SLoGin pub fn mem_block_manager() -> &'static MemBlockManager {
2045626c85SLoGin &MEM_BLOCK_MANAGER
2145626c85SLoGin }
2245626c85SLoGin
2345626c85SLoGin /// 内存区域管理器
2445626c85SLoGin #[derive(Debug)]
2545626c85SLoGin pub struct MemBlockManager {
2645626c85SLoGin inner: SpinLock<InnerMemBlockManager>,
2745626c85SLoGin }
2845626c85SLoGin
2945626c85SLoGin #[derive(Debug)]
3045626c85SLoGin pub struct InnerMemBlockManager {
3145626c85SLoGin /// 初始内存区域
3245626c85SLoGin ///
3345626c85SLoGin /// 用于记录内核启动时的内存布局, 这些区域保持升序、不重叠
3445626c85SLoGin initial_memory_regions: [PhysMemoryArea; INITIAL_MEMORY_REGIONS_NUM],
3545626c85SLoGin initial_memory_regions_num: usize,
3645626c85SLoGin }
3745626c85SLoGin
3845626c85SLoGin impl MemBlockManager {
3945626c85SLoGin #[allow(dead_code)]
4045626c85SLoGin pub const MIN_MEMBLOCK_ADDR: PhysAddr = PhysAddr::new(0);
4145626c85SLoGin #[allow(dead_code)]
4245626c85SLoGin pub const MAX_MEMBLOCK_ADDR: PhysAddr = PhysAddr::new(usize::MAX);
new() -> Self4345626c85SLoGin const fn new() -> Self {
4445626c85SLoGin Self {
4545626c85SLoGin inner: SpinLock::new(InnerMemBlockManager {
4645626c85SLoGin initial_memory_regions: [PhysMemoryArea::DEFAULT; INITIAL_MEMORY_REGIONS_NUM],
4745626c85SLoGin initial_memory_regions_num: 0,
4845626c85SLoGin }),
4945626c85SLoGin }
5045626c85SLoGin }
5145626c85SLoGin
5245626c85SLoGin /// 添加内存区域
5345626c85SLoGin ///
5445626c85SLoGin /// 如果添加的区域与已有区域有重叠,会将重叠的区域合并
5545626c85SLoGin #[allow(dead_code)]
add_block(&self, base: PhysAddr, size: usize) -> Result<(), SystemError>5645626c85SLoGin pub fn add_block(&self, base: PhysAddr, size: usize) -> Result<(), SystemError> {
57453452ccSLoGin let r = self.add_range(base, size, MemoryAreaAttr::empty());
58453452ccSLoGin return r;
5992849878SLoGin }
6092849878SLoGin
6192849878SLoGin /// 添加内存区域
6292849878SLoGin ///
6392849878SLoGin /// 如果添加的区域与已有区域有重叠,会将重叠的区域合并
add_range( &self, base: PhysAddr, size: usize, flags: MemoryAreaAttr, ) -> Result<(), SystemError>6492849878SLoGin fn add_range(
6592849878SLoGin &self,
6692849878SLoGin base: PhysAddr,
6792849878SLoGin size: usize,
6892849878SLoGin flags: MemoryAreaAttr,
6992849878SLoGin ) -> Result<(), SystemError> {
7045626c85SLoGin if size == 0 {
7145626c85SLoGin return Ok(());
7245626c85SLoGin }
7345626c85SLoGin let mut inner = self.inner.lock();
7445626c85SLoGin if inner.initial_memory_regions_num >= INITIAL_MEMORY_REGIONS_NUM {
7545626c85SLoGin panic!("Too many memory regions!");
7645626c85SLoGin }
7745626c85SLoGin
7892849878SLoGin let block = PhysMemoryArea::new(base, size, MemoryAreaAttr::empty());
7945626c85SLoGin // 特判第一个区域
8045626c85SLoGin if inner.initial_memory_regions_num == 0 {
8145626c85SLoGin inner.initial_memory_regions[0] = block;
8245626c85SLoGin inner.initial_memory_regions_num += 1;
8345626c85SLoGin return Ok(());
8445626c85SLoGin }
8545626c85SLoGin
8645626c85SLoGin // 先计算需要添加的区域数量
8745626c85SLoGin let blocks_to_add = self
8892849878SLoGin .do_add_block(&mut inner, block, false, flags)
8945626c85SLoGin .expect("Failed to count blocks to add!");
9045626c85SLoGin
9145626c85SLoGin if inner.initial_memory_regions_num + blocks_to_add > INITIAL_MEMORY_REGIONS_NUM {
92*2eab6dd7S曾俊 error!("Too many memory regions!");
9345626c85SLoGin return Err(SystemError::ENOMEM);
9445626c85SLoGin }
9545626c85SLoGin
9645626c85SLoGin // 然后添加区域
9792849878SLoGin self.do_add_block(&mut inner, block, true, flags)
9845626c85SLoGin .expect("Failed to add block!");
9945626c85SLoGin
10045626c85SLoGin return Ok(());
10145626c85SLoGin }
10245626c85SLoGin
do_add_block( &self, inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, block: PhysMemoryArea, insert: bool, flags: MemoryAreaAttr, ) -> Result<usize, SystemError>10345626c85SLoGin fn do_add_block(
10445626c85SLoGin &self,
10545626c85SLoGin inner: &mut SpinLockGuard<'_, InnerMemBlockManager>,
10645626c85SLoGin block: PhysMemoryArea,
10745626c85SLoGin insert: bool,
10892849878SLoGin flags: MemoryAreaAttr,
10945626c85SLoGin ) -> Result<usize, SystemError> {
11045626c85SLoGin let mut base = block.base;
11145626c85SLoGin let end = block.base + block.size;
11245626c85SLoGin let mut i = 0;
11345626c85SLoGin let mut start_index = -1;
11445626c85SLoGin let mut end_index = -1;
11545626c85SLoGin
11645626c85SLoGin let mut num_to_add = 0;
11745626c85SLoGin
11845626c85SLoGin while i < inner.initial_memory_regions_num {
11945626c85SLoGin let range_base = inner.initial_memory_regions[i].base;
12045626c85SLoGin let range_end =
12145626c85SLoGin inner.initial_memory_regions[i].base + inner.initial_memory_regions[i].size;
12245626c85SLoGin
12345626c85SLoGin if range_base >= end {
12445626c85SLoGin break;
12545626c85SLoGin }
12645626c85SLoGin if range_end <= base {
12745626c85SLoGin i += 1;
12845626c85SLoGin continue;
12945626c85SLoGin }
13045626c85SLoGin
13145626c85SLoGin // 有重叠
13245626c85SLoGin
13345626c85SLoGin if range_base > base {
13445626c85SLoGin num_to_add += 1;
13545626c85SLoGin if insert {
13645626c85SLoGin if start_index == -1 {
13745626c85SLoGin start_index = i as isize;
13845626c85SLoGin }
13945626c85SLoGin end_index = (i + 1) as isize;
14092849878SLoGin self.do_insert_area(inner, i, base, range_base - base, flags);
14145626c85SLoGin i += 1;
14245626c85SLoGin }
14345626c85SLoGin }
14445626c85SLoGin
14545626c85SLoGin i += 1;
14645626c85SLoGin base = core::cmp::min(range_end, end);
14745626c85SLoGin }
14845626c85SLoGin
14945626c85SLoGin if base < end {
15045626c85SLoGin num_to_add += 1;
15145626c85SLoGin if insert {
15245626c85SLoGin if start_index == -1 {
15345626c85SLoGin start_index = i as isize;
15445626c85SLoGin }
15545626c85SLoGin end_index = (i + 1) as isize;
15692849878SLoGin self.do_insert_area(inner, i, base, end - base, flags);
15745626c85SLoGin }
15845626c85SLoGin }
15945626c85SLoGin
16045626c85SLoGin if num_to_add == 0 {
16145626c85SLoGin return Ok(0);
16245626c85SLoGin }
16345626c85SLoGin
16445626c85SLoGin if insert {
16545626c85SLoGin self.do_merge_blocks(inner, start_index, end_index);
16645626c85SLoGin }
16745626c85SLoGin return Ok(num_to_add);
16845626c85SLoGin }
16945626c85SLoGin
do_insert_area( &self, inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, index: usize, base: PhysAddr, size: usize, flags: MemoryAreaAttr, )17045626c85SLoGin fn do_insert_area(
17145626c85SLoGin &self,
17245626c85SLoGin inner: &mut SpinLockGuard<'_, InnerMemBlockManager>,
17345626c85SLoGin index: usize,
17445626c85SLoGin base: PhysAddr,
17545626c85SLoGin size: usize,
17692849878SLoGin flags: MemoryAreaAttr,
17745626c85SLoGin ) {
17845626c85SLoGin let copy_elements = inner.initial_memory_regions_num - index;
17945626c85SLoGin inner
18045626c85SLoGin .initial_memory_regions
18145626c85SLoGin .copy_within(index..index + copy_elements, index + 1);
18292849878SLoGin inner.initial_memory_regions[index] = PhysMemoryArea::new(base, size, flags);
18345626c85SLoGin inner.initial_memory_regions_num += 1;
18445626c85SLoGin }
18545626c85SLoGin
do_merge_blocks( &self, inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, start_index: isize, mut end_index: isize, )18645626c85SLoGin fn do_merge_blocks(
18745626c85SLoGin &self,
18845626c85SLoGin inner: &mut SpinLockGuard<'_, InnerMemBlockManager>,
18945626c85SLoGin start_index: isize,
19045626c85SLoGin mut end_index: isize,
19145626c85SLoGin ) {
19245626c85SLoGin let mut i = 0;
19345626c85SLoGin if start_index > 0 {
19445626c85SLoGin i = start_index - 1;
19545626c85SLoGin }
19645626c85SLoGin end_index = core::cmp::min(end_index, inner.initial_memory_regions_num as isize - 1);
19745626c85SLoGin
19845626c85SLoGin while i < end_index {
19945626c85SLoGin {
20045626c85SLoGin let next_base = inner.initial_memory_regions[(i + 1) as usize].base;
20145626c85SLoGin let next_size = inner.initial_memory_regions[(i + 1) as usize].size;
20292849878SLoGin let next_flags = inner.initial_memory_regions[(i + 1) as usize].flags;
20345626c85SLoGin let this = &mut inner.initial_memory_regions[i as usize];
20445626c85SLoGin
20592849878SLoGin if this.base + this.size != next_base || this.flags != next_flags {
20692849878SLoGin if unlikely(this.base + this.size > next_base) {
207*2eab6dd7S曾俊 panic!("this->base + this->size > next->base");
20892849878SLoGin }
20945626c85SLoGin i += 1;
21045626c85SLoGin continue;
21145626c85SLoGin }
21245626c85SLoGin this.size += next_size;
21345626c85SLoGin }
21445626c85SLoGin // 移动后面的区域
21545626c85SLoGin let copy_elements = inner.initial_memory_regions_num - (i + 2) as usize;
21645626c85SLoGin inner.initial_memory_regions.copy_within(
21745626c85SLoGin (i + 2) as usize..(i as usize + 2 + copy_elements),
21845626c85SLoGin (i + 1) as usize,
21945626c85SLoGin );
22045626c85SLoGin
22145626c85SLoGin inner.initial_memory_regions_num -= 1;
22245626c85SLoGin end_index -= 1;
22345626c85SLoGin }
22445626c85SLoGin }
22545626c85SLoGin
22645626c85SLoGin /// 移除内存区域
22745626c85SLoGin ///
22845626c85SLoGin /// 如果移除的区域与已有区域有重叠,会将重叠的区域分割
22945626c85SLoGin #[allow(dead_code)]
remove_block(&self, base: PhysAddr, size: usize) -> Result<(), SystemError>23045626c85SLoGin pub fn remove_block(&self, base: PhysAddr, size: usize) -> Result<(), SystemError> {
23145626c85SLoGin if size == 0 {
23245626c85SLoGin return Ok(());
23345626c85SLoGin }
23445626c85SLoGin let mut inner = self.inner.lock();
23545626c85SLoGin if inner.initial_memory_regions_num == 0 {
23645626c85SLoGin return Ok(());
23745626c85SLoGin }
23845626c85SLoGin
23945626c85SLoGin let (start_index, end_index) = self
24045626c85SLoGin .isolate_range(&mut inner, base, size)
24145626c85SLoGin .expect("Failed to isolate range!");
24245626c85SLoGin
24345626c85SLoGin for i in (start_index..end_index).rev() {
24445626c85SLoGin self.do_remove_region(&mut inner, i);
24545626c85SLoGin }
24645626c85SLoGin return Ok(());
24745626c85SLoGin }
24845626c85SLoGin
do_remove_region(&self, inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, index: usize)24945626c85SLoGin fn do_remove_region(&self, inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, index: usize) {
25045626c85SLoGin let copy_elements = inner.initial_memory_regions_num - index - 1;
25145626c85SLoGin inner
25245626c85SLoGin .initial_memory_regions
25345626c85SLoGin .copy_within(index + 1..index + 1 + copy_elements, index);
25445626c85SLoGin
25545626c85SLoGin inner.initial_memory_regions_num -= 1;
25645626c85SLoGin
25745626c85SLoGin if inner.initial_memory_regions_num == 0 {
25845626c85SLoGin inner.initial_memory_regions[0].base = PhysAddr::new(0);
25945626c85SLoGin inner.initial_memory_regions[0].size = 0;
26045626c85SLoGin }
26145626c85SLoGin }
26245626c85SLoGin
26392849878SLoGin /// 在一个内存块管理器中找到一个物理地址范围内的
26492849878SLoGin /// 空闲块,并隔离出所需的内存大小
26592849878SLoGin ///
26692849878SLoGin /// ## 返回值
26792849878SLoGin ///
26892849878SLoGin /// - Ok((start_index, end_index)) 表示成功找到了一个连续的内存区域来满足所需的 size。这里:
26992849878SLoGin /// - start_index 是指定的起始内存区域的索引。
27092849878SLoGin /// - end_index 是指定的结束内存区域的索引,它实际上不包含在返回的连续区域中,但它标志着下一个可能的不连续区域的开始。
27192849878SLoGin /// - Err(SystemError) 则表示没有找到足够的空间来满足请求的 size,可能是因为内存区域不足或存在其他系统错误
isolate_range( &self, inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, base: PhysAddr, size: usize, ) -> Result<(usize, usize), SystemError>27245626c85SLoGin fn isolate_range(
27345626c85SLoGin &self,
27445626c85SLoGin inner: &mut SpinLockGuard<'_, InnerMemBlockManager>,
27545626c85SLoGin base: PhysAddr,
27645626c85SLoGin size: usize,
27745626c85SLoGin ) -> Result<(usize, usize), SystemError> {
27845626c85SLoGin let end = base + size;
27945626c85SLoGin
28045626c85SLoGin let mut idx = 0;
28145626c85SLoGin
28245626c85SLoGin let mut start_index = 0;
28345626c85SLoGin let mut end_index = 0;
28445626c85SLoGin
28545626c85SLoGin if size == 0 {
28645626c85SLoGin return Ok((0, 0));
28745626c85SLoGin }
28845626c85SLoGin
28945626c85SLoGin while idx < inner.initial_memory_regions_num {
29045626c85SLoGin let range_base = inner.initial_memory_regions[idx].base;
29145626c85SLoGin let range_end = range_base + inner.initial_memory_regions[idx].size;
29245626c85SLoGin
29345626c85SLoGin if range_base >= end {
29445626c85SLoGin break;
29545626c85SLoGin }
29645626c85SLoGin if range_end <= base {
29745626c85SLoGin idx = idx.checked_add(1).unwrap_or(0);
29845626c85SLoGin continue;
29945626c85SLoGin }
30045626c85SLoGin
30145626c85SLoGin if range_base < base {
30245626c85SLoGin // regions[idx] intersects from below
30345626c85SLoGin inner.initial_memory_regions[idx].base = base;
30445626c85SLoGin inner.initial_memory_regions[idx].size -= base - range_base;
30592849878SLoGin self.do_insert_area(
30692849878SLoGin inner,
30792849878SLoGin idx,
30892849878SLoGin range_base,
30992849878SLoGin base - range_base,
31092849878SLoGin inner.initial_memory_regions[idx].flags,
31192849878SLoGin );
31245626c85SLoGin } else if range_end > end {
31345626c85SLoGin // regions[idx] intersects from above
31445626c85SLoGin inner.initial_memory_regions[idx].base = end;
31545626c85SLoGin inner.initial_memory_regions[idx].size -= end - range_base;
31645626c85SLoGin
31792849878SLoGin self.do_insert_area(
31892849878SLoGin inner,
31992849878SLoGin idx,
32092849878SLoGin range_base,
32192849878SLoGin end - range_base,
32292849878SLoGin inner.initial_memory_regions[idx].flags,
32392849878SLoGin );
32445626c85SLoGin if idx == 0 {
32545626c85SLoGin idx = usize::MAX;
32645626c85SLoGin } else {
32745626c85SLoGin idx -= 1;
32845626c85SLoGin }
32945626c85SLoGin } else {
33045626c85SLoGin // regions[idx] is inside the range, record it
33145626c85SLoGin if end_index == 0 {
33245626c85SLoGin start_index = idx;
33345626c85SLoGin }
33445626c85SLoGin end_index = idx + 1;
33545626c85SLoGin }
33645626c85SLoGin
33745626c85SLoGin idx = idx.checked_add(1).unwrap_or(0);
33845626c85SLoGin }
33945626c85SLoGin
34045626c85SLoGin return Ok((start_index, end_index));
34145626c85SLoGin }
34245626c85SLoGin
34392849878SLoGin /// mark_nomap - 用`MemoryAreaAttr::NOMAP`标志标记内存区域
34492849878SLoGin ///
34592849878SLoGin /// ## 参数
34692849878SLoGin ///
34792849878SLoGin /// - base: 区域的物理基地址
34892849878SLoGin /// - size: 区域的大小
34992849878SLoGin ///
35092849878SLoGin /// 使用`MemoryAreaAttr::NOMAP`标志标记的内存区域将不会被添加到物理内存的直接映射中。这些区域仍然会被内存映射所覆盖。内存映射中代表NOMAP内存帧的struct page将被PageReserved()。
35192849878SLoGin /// 注意:如果被标记为`MemoryAreaAttr::NOMAP`的内存是从memblock分配的,调用者必须忽略该内存
mark_nomap(&self, base: PhysAddr, size: usize) -> Result<(), SystemError>35292849878SLoGin pub fn mark_nomap(&self, base: PhysAddr, size: usize) -> Result<(), SystemError> {
35392849878SLoGin return self.set_or_clear_flags(base, size, true, MemoryAreaAttr::NOMAP);
35492849878SLoGin }
35592849878SLoGin
356471d65cfSLoGin /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/mm/memblock.c?fi=memblock_mark_mirror#940
mark_mirror(&self, base: PhysAddr, size: usize) -> Result<(), SystemError>357471d65cfSLoGin pub fn mark_mirror(&self, base: PhysAddr, size: usize) -> Result<(), SystemError> {
358471d65cfSLoGin return self.set_or_clear_flags(base, size, true, MemoryAreaAttr::MIRROR);
359471d65cfSLoGin }
360471d65cfSLoGin
set_or_clear_flags( &self, mut base: PhysAddr, mut size: usize, set: bool, flags: MemoryAreaAttr, ) -> Result<(), SystemError>36192849878SLoGin fn set_or_clear_flags(
36292849878SLoGin &self,
363453452ccSLoGin mut base: PhysAddr,
364453452ccSLoGin mut size: usize,
36592849878SLoGin set: bool,
36692849878SLoGin flags: MemoryAreaAttr,
36792849878SLoGin ) -> Result<(), SystemError> {
368453452ccSLoGin let rsvd_base = PhysAddr::new(page_align_down(base.data()));
369b5b571e0SLoGin size = page_align_up(size + base.data() - rsvd_base.data());
370453452ccSLoGin base = rsvd_base;
371453452ccSLoGin
37292849878SLoGin let mut inner = self.inner.lock();
37392849878SLoGin let (start_index, end_index) = self.isolate_range(&mut inner, base, size)?;
37492849878SLoGin for i in start_index..end_index {
37592849878SLoGin if set {
37692849878SLoGin inner.initial_memory_regions[i].flags |= flags;
37792849878SLoGin } else {
37892849878SLoGin inner.initial_memory_regions[i].flags &= !flags;
37992849878SLoGin }
38092849878SLoGin }
38192849878SLoGin
38292849878SLoGin let num = inner.initial_memory_regions_num as isize;
38392849878SLoGin self.do_merge_blocks(&mut inner, 0, num);
38492849878SLoGin return Ok(());
38592849878SLoGin }
38692849878SLoGin
38792849878SLoGin /// 标记内存区域为保留区域
reserve_block(&self, base: PhysAddr, size: usize) -> Result<(), SystemError>38892849878SLoGin pub fn reserve_block(&self, base: PhysAddr, size: usize) -> Result<(), SystemError> {
38992849878SLoGin return self.set_or_clear_flags(base, size, true, MemoryAreaAttr::RESERVED);
39092849878SLoGin }
39192849878SLoGin
392453452ccSLoGin /// 判断[base, base+size)与已有区域是否有重叠
is_overlapped(&self, base: PhysAddr, size: usize) -> bool393453452ccSLoGin pub fn is_overlapped(&self, base: PhysAddr, size: usize) -> bool {
394453452ccSLoGin let inner = self.inner.lock();
395453452ccSLoGin return self.do_is_overlapped(base, size, false, &inner);
396453452ccSLoGin }
397453452ccSLoGin
398453452ccSLoGin /// 判断[base, base+size)与已有Reserved区域是否有重叠
is_overlapped_with_reserved(&self, base: PhysAddr, size: usize) -> bool399453452ccSLoGin pub fn is_overlapped_with_reserved(&self, base: PhysAddr, size: usize) -> bool {
400453452ccSLoGin let inner = self.inner.lock();
401453452ccSLoGin return self.do_is_overlapped(base, size, true, &inner);
402453452ccSLoGin }
403453452ccSLoGin
do_is_overlapped( &self, base: PhysAddr, size: usize, require_reserved: bool, inner: &SpinLockGuard<'_, InnerMemBlockManager>, ) -> bool404453452ccSLoGin fn do_is_overlapped(
405453452ccSLoGin &self,
406453452ccSLoGin base: PhysAddr,
407453452ccSLoGin size: usize,
408453452ccSLoGin require_reserved: bool,
409453452ccSLoGin inner: &SpinLockGuard<'_, InnerMemBlockManager>,
410453452ccSLoGin ) -> bool {
411453452ccSLoGin let mut res = false;
412453452ccSLoGin for i in 0..inner.initial_memory_regions_num {
413453452ccSLoGin if require_reserved
414453452ccSLoGin && !inner.initial_memory_regions[i]
415453452ccSLoGin .flags
416453452ccSLoGin .contains(MemoryAreaAttr::RESERVED)
417453452ccSLoGin {
418453452ccSLoGin // 忽略非保留区域
419453452ccSLoGin continue;
420453452ccSLoGin }
421453452ccSLoGin
422453452ccSLoGin let range_base = inner.initial_memory_regions[i].base;
423453452ccSLoGin let range_end = range_base + inner.initial_memory_regions[i].size;
424453452ccSLoGin if (base >= range_base && base < range_end)
425453452ccSLoGin || (base + size > range_base && base + size <= range_end)
426453452ccSLoGin || (base <= range_base && base + size >= range_end)
427453452ccSLoGin {
428453452ccSLoGin res = true;
429453452ccSLoGin break;
430453452ccSLoGin }
431453452ccSLoGin }
432453452ccSLoGin
433453452ccSLoGin return res;
434453452ccSLoGin }
435453452ccSLoGin
43645626c85SLoGin /// 生成迭代器
to_iter(&self) -> MemBlockIter43745626c85SLoGin pub fn to_iter(&self) -> MemBlockIter {
43845626c85SLoGin let inner = self.inner.lock();
439453452ccSLoGin return MemBlockIter {
440453452ccSLoGin inner,
441453452ccSLoGin index: 0,
442453452ccSLoGin usable_only: false,
443453452ccSLoGin };
444453452ccSLoGin }
445453452ccSLoGin
446453452ccSLoGin /// 生成迭代器,迭代所有可用的物理内存区域
to_iter_available(&self) -> MemBlockIter447453452ccSLoGin pub fn to_iter_available(&self) -> MemBlockIter {
448453452ccSLoGin let inner = self.inner.lock();
449453452ccSLoGin return MemBlockIter {
450453452ccSLoGin inner,
451453452ccSLoGin index: 0,
452453452ccSLoGin usable_only: true,
453453452ccSLoGin };
45445626c85SLoGin }
45545626c85SLoGin
45645626c85SLoGin /// 获取初始内存区域数量
total_initial_memory_regions(&self) -> usize45745626c85SLoGin pub fn total_initial_memory_regions(&self) -> usize {
45845626c85SLoGin let inner = self.inner.lock();
45945626c85SLoGin return inner.initial_memory_regions_num;
46045626c85SLoGin }
46145626c85SLoGin
46245626c85SLoGin /// 根据索引获取初始内存区域
get_initial_memory_region(&self, index: usize) -> Option<PhysMemoryArea>46345626c85SLoGin pub fn get_initial_memory_region(&self, index: usize) -> Option<PhysMemoryArea> {
46445626c85SLoGin let inner = self.inner.lock();
46545626c85SLoGin return inner.initial_memory_regions.get(index).copied();
46645626c85SLoGin }
46745626c85SLoGin }
46845626c85SLoGin
46945626c85SLoGin pub struct MemBlockIter<'a> {
47045626c85SLoGin inner: SpinLockGuard<'a, InnerMemBlockManager>,
47145626c85SLoGin index: usize,
472453452ccSLoGin usable_only: bool,
47345626c85SLoGin }
47445626c85SLoGin
47545626c85SLoGin #[allow(dead_code)]
47645626c85SLoGin impl<'a> MemBlockIter<'a> {
47745626c85SLoGin /// 获取内存区域数量
total_num(&self) -> usize47845626c85SLoGin pub fn total_num(&self) -> usize {
47945626c85SLoGin self.inner.initial_memory_regions_num
48045626c85SLoGin }
48145626c85SLoGin
48245626c85SLoGin /// 获取指定索引的内存区域
get_area(&self, index: usize) -> &PhysMemoryArea48345626c85SLoGin pub fn get_area(&self, index: usize) -> &PhysMemoryArea {
48445626c85SLoGin &self.inner.initial_memory_regions[index]
48545626c85SLoGin }
48645626c85SLoGin
48745626c85SLoGin /// 获取当前索引
current_index(&self) -> usize48845626c85SLoGin pub fn current_index(&self) -> usize {
48945626c85SLoGin self.index
49045626c85SLoGin }
49145626c85SLoGin }
49245626c85SLoGin
49345626c85SLoGin impl<'a> Iterator for MemBlockIter<'a> {
49445626c85SLoGin type Item = PhysMemoryArea;
49545626c85SLoGin
next(&mut self) -> Option<Self::Item>49645626c85SLoGin fn next(&mut self) -> Option<Self::Item> {
497453452ccSLoGin while self.index < self.inner.initial_memory_regions_num {
498b5b571e0SLoGin if self.usable_only
499b5b571e0SLoGin && !self.inner.initial_memory_regions[self.index]
500453452ccSLoGin .flags
501453452ccSLoGin .is_empty()
502453452ccSLoGin {
503453452ccSLoGin self.index += 1;
504453452ccSLoGin if self.index >= self.inner.initial_memory_regions_num {
505453452ccSLoGin return None;
506453452ccSLoGin }
507453452ccSLoGin continue;
508453452ccSLoGin }
509453452ccSLoGin break;
510453452ccSLoGin }
51145626c85SLoGin if self.index >= self.inner.initial_memory_regions_num {
51245626c85SLoGin return None;
51345626c85SLoGin }
51445626c85SLoGin let ret = self.inner.initial_memory_regions[self.index];
51545626c85SLoGin self.index += 1;
51645626c85SLoGin return Some(ret);
51745626c85SLoGin }
51845626c85SLoGin }
51992849878SLoGin
52092849878SLoGin bitflags! {
52192849878SLoGin /// 内存区域属性
522b5b571e0SLoGin #[allow(clippy::bad_bit_mask)]
52392849878SLoGin pub struct MemoryAreaAttr: u32 {
52492849878SLoGin /// No special request
52592849878SLoGin const NONE = 0x0;
52692849878SLoGin /// Hotpluggable region
52792849878SLoGin const HOTPLUG = (1 << 0);
52892849878SLoGin /// Mirrored region
52992849878SLoGin const MIRROR = (1 << 1);
53092849878SLoGin /// do not add to kenrel direct mapping
53192849878SLoGin const NOMAP = (1 << 2);
53292849878SLoGin /// Always detected via a driver
53392849878SLoGin const DRIVER_MANAGED = (1 << 3);
53492849878SLoGin /// Memory is reserved
53592849878SLoGin const RESERVED = (1 << 4);
53692849878SLoGin }
53792849878SLoGin }
538