1*92849878SLoGin use core::intrinsics::unlikely; 2*92849878SLoGin 345626c85SLoGin use system_error::SystemError; 445626c85SLoGin 545626c85SLoGin use crate::libs::spinlock::{SpinLock, SpinLockGuard}; 645626c85SLoGin 745626c85SLoGin use super::{PhysAddr, PhysMemoryArea}; 845626c85SLoGin 945626c85SLoGin pub const INITIAL_MEMORY_REGIONS_NUM: usize = 128; 1045626c85SLoGin 1145626c85SLoGin /// 初始内存区域 1245626c85SLoGin static MEM_BLOCK_MANAGER: MemBlockManager = MemBlockManager::new(); 1345626c85SLoGin 1445626c85SLoGin #[inline(always)] 1545626c85SLoGin pub fn mem_block_manager() -> &'static MemBlockManager { 1645626c85SLoGin &MEM_BLOCK_MANAGER 1745626c85SLoGin } 1845626c85SLoGin 1945626c85SLoGin /// 内存区域管理器 2045626c85SLoGin #[derive(Debug)] 2145626c85SLoGin pub struct MemBlockManager { 2245626c85SLoGin inner: SpinLock<InnerMemBlockManager>, 2345626c85SLoGin } 2445626c85SLoGin 2545626c85SLoGin #[derive(Debug)] 2645626c85SLoGin pub struct InnerMemBlockManager { 2745626c85SLoGin /// 初始内存区域 2845626c85SLoGin /// 2945626c85SLoGin /// 用于记录内核启动时的内存布局, 这些区域保持升序、不重叠 3045626c85SLoGin initial_memory_regions: [PhysMemoryArea; INITIAL_MEMORY_REGIONS_NUM], 3145626c85SLoGin initial_memory_regions_num: usize, 3245626c85SLoGin } 3345626c85SLoGin 3445626c85SLoGin impl MemBlockManager { 3545626c85SLoGin #[allow(dead_code)] 3645626c85SLoGin pub const MIN_MEMBLOCK_ADDR: PhysAddr = PhysAddr::new(0); 3745626c85SLoGin #[allow(dead_code)] 3845626c85SLoGin pub const MAX_MEMBLOCK_ADDR: PhysAddr = PhysAddr::new(usize::MAX); 3945626c85SLoGin const fn new() -> Self { 4045626c85SLoGin Self { 4145626c85SLoGin inner: SpinLock::new(InnerMemBlockManager { 4245626c85SLoGin initial_memory_regions: [PhysMemoryArea::DEFAULT; INITIAL_MEMORY_REGIONS_NUM], 4345626c85SLoGin initial_memory_regions_num: 0, 4445626c85SLoGin }), 4545626c85SLoGin } 4645626c85SLoGin } 4745626c85SLoGin 4845626c85SLoGin /// 添加内存区域 4945626c85SLoGin /// 5045626c85SLoGin /// 如果添加的区域与已有区域有重叠,会将重叠的区域合并 5145626c85SLoGin #[allow(dead_code)] 5245626c85SLoGin pub fn add_block(&self, base: PhysAddr, size: usize) -> Result<(), SystemError> { 53*92849878SLoGin return self.add_range(base, size, MemoryAreaAttr::empty()); 54*92849878SLoGin } 55*92849878SLoGin 56*92849878SLoGin /// 添加内存区域 57*92849878SLoGin /// 58*92849878SLoGin /// 如果添加的区域与已有区域有重叠,会将重叠的区域合并 59*92849878SLoGin fn add_range( 60*92849878SLoGin &self, 61*92849878SLoGin base: PhysAddr, 62*92849878SLoGin size: usize, 63*92849878SLoGin flags: MemoryAreaAttr, 64*92849878SLoGin ) -> Result<(), SystemError> { 6545626c85SLoGin if size == 0 { 6645626c85SLoGin return Ok(()); 6745626c85SLoGin } 6845626c85SLoGin let mut inner = self.inner.lock(); 6945626c85SLoGin if inner.initial_memory_regions_num >= INITIAL_MEMORY_REGIONS_NUM { 7045626c85SLoGin panic!("Too many memory regions!"); 7145626c85SLoGin } 7245626c85SLoGin 73*92849878SLoGin let block = PhysMemoryArea::new(base, size, MemoryAreaAttr::empty()); 7445626c85SLoGin // 特判第一个区域 7545626c85SLoGin if inner.initial_memory_regions_num == 0 { 7645626c85SLoGin inner.initial_memory_regions[0] = block; 7745626c85SLoGin inner.initial_memory_regions_num += 1; 7845626c85SLoGin return Ok(()); 7945626c85SLoGin } 8045626c85SLoGin 8145626c85SLoGin // 先计算需要添加的区域数量 8245626c85SLoGin let blocks_to_add = self 83*92849878SLoGin .do_add_block(&mut inner, block, false, flags) 8445626c85SLoGin .expect("Failed to count blocks to add!"); 8545626c85SLoGin 8645626c85SLoGin if inner.initial_memory_regions_num + blocks_to_add > INITIAL_MEMORY_REGIONS_NUM { 8745626c85SLoGin kerror!("Too many memory regions!"); 8845626c85SLoGin return Err(SystemError::ENOMEM); 8945626c85SLoGin } 9045626c85SLoGin 9145626c85SLoGin // 然后添加区域 92*92849878SLoGin self.do_add_block(&mut inner, block, true, flags) 9345626c85SLoGin .expect("Failed to add block!"); 9445626c85SLoGin 9545626c85SLoGin return Ok(()); 9645626c85SLoGin } 9745626c85SLoGin 9845626c85SLoGin fn do_add_block( 9945626c85SLoGin &self, 10045626c85SLoGin inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, 10145626c85SLoGin block: PhysMemoryArea, 10245626c85SLoGin insert: bool, 103*92849878SLoGin flags: MemoryAreaAttr, 10445626c85SLoGin ) -> Result<usize, SystemError> { 10545626c85SLoGin let mut base = block.base; 10645626c85SLoGin let end = block.base + block.size; 10745626c85SLoGin let mut i = 0; 10845626c85SLoGin let mut start_index = -1; 10945626c85SLoGin let mut end_index = -1; 11045626c85SLoGin 11145626c85SLoGin let mut num_to_add = 0; 11245626c85SLoGin 11345626c85SLoGin while i < inner.initial_memory_regions_num { 11445626c85SLoGin let range_base = inner.initial_memory_regions[i].base; 11545626c85SLoGin let range_end = 11645626c85SLoGin inner.initial_memory_regions[i].base + inner.initial_memory_regions[i].size; 11745626c85SLoGin 11845626c85SLoGin if range_base >= end { 11945626c85SLoGin break; 12045626c85SLoGin } 12145626c85SLoGin if range_end <= base { 12245626c85SLoGin i += 1; 12345626c85SLoGin continue; 12445626c85SLoGin } 12545626c85SLoGin 12645626c85SLoGin // 有重叠 12745626c85SLoGin 12845626c85SLoGin if range_base > base { 12945626c85SLoGin num_to_add += 1; 13045626c85SLoGin if insert { 13145626c85SLoGin if start_index == -1 { 13245626c85SLoGin start_index = i as isize; 13345626c85SLoGin } 13445626c85SLoGin end_index = (i + 1) as isize; 135*92849878SLoGin self.do_insert_area(inner, i, base, range_base - base, flags); 13645626c85SLoGin i += 1; 13745626c85SLoGin } 13845626c85SLoGin } 13945626c85SLoGin 14045626c85SLoGin i += 1; 14145626c85SLoGin base = core::cmp::min(range_end, end); 14245626c85SLoGin } 14345626c85SLoGin 14445626c85SLoGin if base < end { 14545626c85SLoGin num_to_add += 1; 14645626c85SLoGin if insert { 14745626c85SLoGin if start_index == -1 { 14845626c85SLoGin start_index = i as isize; 14945626c85SLoGin } 15045626c85SLoGin end_index = (i + 1) as isize; 151*92849878SLoGin self.do_insert_area(inner, i, base, end - base, flags); 15245626c85SLoGin } 15345626c85SLoGin } 15445626c85SLoGin 15545626c85SLoGin if num_to_add == 0 { 15645626c85SLoGin return Ok(0); 15745626c85SLoGin } 15845626c85SLoGin 15945626c85SLoGin if insert { 16045626c85SLoGin self.do_merge_blocks(inner, start_index, end_index); 16145626c85SLoGin } 16245626c85SLoGin return Ok(num_to_add); 16345626c85SLoGin } 16445626c85SLoGin 16545626c85SLoGin fn do_insert_area( 16645626c85SLoGin &self, 16745626c85SLoGin inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, 16845626c85SLoGin index: usize, 16945626c85SLoGin base: PhysAddr, 17045626c85SLoGin size: usize, 171*92849878SLoGin flags: MemoryAreaAttr, 17245626c85SLoGin ) { 17345626c85SLoGin let copy_elements = inner.initial_memory_regions_num - index; 17445626c85SLoGin inner 17545626c85SLoGin .initial_memory_regions 17645626c85SLoGin .copy_within(index..index + copy_elements, index + 1); 177*92849878SLoGin inner.initial_memory_regions[index] = PhysMemoryArea::new(base, size, flags); 17845626c85SLoGin inner.initial_memory_regions_num += 1; 17945626c85SLoGin } 18045626c85SLoGin 18145626c85SLoGin fn do_merge_blocks( 18245626c85SLoGin &self, 18345626c85SLoGin inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, 18445626c85SLoGin start_index: isize, 18545626c85SLoGin mut end_index: isize, 18645626c85SLoGin ) { 18745626c85SLoGin let mut i = 0; 18845626c85SLoGin if start_index > 0 { 18945626c85SLoGin i = start_index - 1; 19045626c85SLoGin } 19145626c85SLoGin end_index = core::cmp::min(end_index, inner.initial_memory_regions_num as isize - 1); 19245626c85SLoGin 19345626c85SLoGin while i < end_index { 19445626c85SLoGin { 19545626c85SLoGin let next_base = inner.initial_memory_regions[(i + 1) as usize].base; 19645626c85SLoGin let next_size = inner.initial_memory_regions[(i + 1) as usize].size; 197*92849878SLoGin let next_flags = inner.initial_memory_regions[(i + 1) as usize].flags; 19845626c85SLoGin let this = &mut inner.initial_memory_regions[i as usize]; 19945626c85SLoGin 200*92849878SLoGin if this.base + this.size != next_base || this.flags != next_flags { 201*92849878SLoGin if unlikely(this.base + this.size > next_base) { 202*92849878SLoGin kBUG!("this->base + this->size > next->base"); 203*92849878SLoGin } 20445626c85SLoGin i += 1; 20545626c85SLoGin continue; 20645626c85SLoGin } 20745626c85SLoGin this.size += next_size; 20845626c85SLoGin } 20945626c85SLoGin // 移动后面的区域 21045626c85SLoGin let copy_elements = inner.initial_memory_regions_num - (i + 2) as usize; 21145626c85SLoGin inner.initial_memory_regions.copy_within( 21245626c85SLoGin (i + 2) as usize..(i as usize + 2 + copy_elements), 21345626c85SLoGin (i + 1) as usize, 21445626c85SLoGin ); 21545626c85SLoGin 21645626c85SLoGin inner.initial_memory_regions_num -= 1; 21745626c85SLoGin end_index -= 1; 21845626c85SLoGin } 21945626c85SLoGin } 22045626c85SLoGin 22145626c85SLoGin /// 移除内存区域 22245626c85SLoGin /// 22345626c85SLoGin /// 如果移除的区域与已有区域有重叠,会将重叠的区域分割 22445626c85SLoGin #[allow(dead_code)] 22545626c85SLoGin pub fn remove_block(&self, base: PhysAddr, size: usize) -> Result<(), SystemError> { 22645626c85SLoGin if size == 0 { 22745626c85SLoGin return Ok(()); 22845626c85SLoGin } 22945626c85SLoGin let mut inner = self.inner.lock(); 23045626c85SLoGin if inner.initial_memory_regions_num == 0 { 23145626c85SLoGin return Ok(()); 23245626c85SLoGin } 23345626c85SLoGin 23445626c85SLoGin let (start_index, end_index) = self 23545626c85SLoGin .isolate_range(&mut inner, base, size) 23645626c85SLoGin .expect("Failed to isolate range!"); 23745626c85SLoGin 23845626c85SLoGin for i in (start_index..end_index).rev() { 23945626c85SLoGin self.do_remove_region(&mut inner, i); 24045626c85SLoGin } 24145626c85SLoGin return Ok(()); 24245626c85SLoGin } 24345626c85SLoGin 24445626c85SLoGin fn do_remove_region(&self, inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, index: usize) { 24545626c85SLoGin let copy_elements = inner.initial_memory_regions_num - index - 1; 24645626c85SLoGin inner 24745626c85SLoGin .initial_memory_regions 24845626c85SLoGin .copy_within(index + 1..index + 1 + copy_elements, index); 24945626c85SLoGin 25045626c85SLoGin inner.initial_memory_regions_num -= 1; 25145626c85SLoGin 25245626c85SLoGin if inner.initial_memory_regions_num == 0 { 25345626c85SLoGin inner.initial_memory_regions[0].base = PhysAddr::new(0); 25445626c85SLoGin inner.initial_memory_regions[0].size = 0; 25545626c85SLoGin } 25645626c85SLoGin } 25745626c85SLoGin 258*92849878SLoGin /// 在一个内存块管理器中找到一个物理地址范围内的 259*92849878SLoGin /// 空闲块,并隔离出所需的内存大小 260*92849878SLoGin /// 261*92849878SLoGin /// ## 返回值 262*92849878SLoGin /// 263*92849878SLoGin /// - Ok((start_index, end_index)) 表示成功找到了一个连续的内存区域来满足所需的 size。这里: 264*92849878SLoGin /// - start_index 是指定的起始内存区域的索引。 265*92849878SLoGin /// - end_index 是指定的结束内存区域的索引,它实际上不包含在返回的连续区域中,但它标志着下一个可能的不连续区域的开始。 266*92849878SLoGin /// - Err(SystemError) 则表示没有找到足够的空间来满足请求的 size,可能是因为内存区域不足或存在其他系统错误 26745626c85SLoGin fn isolate_range( 26845626c85SLoGin &self, 26945626c85SLoGin inner: &mut SpinLockGuard<'_, InnerMemBlockManager>, 27045626c85SLoGin base: PhysAddr, 27145626c85SLoGin size: usize, 27245626c85SLoGin ) -> Result<(usize, usize), SystemError> { 27345626c85SLoGin let end = base + size; 27445626c85SLoGin 27545626c85SLoGin let mut idx = 0; 27645626c85SLoGin 27745626c85SLoGin let mut start_index = 0; 27845626c85SLoGin let mut end_index = 0; 27945626c85SLoGin 28045626c85SLoGin if size == 0 { 28145626c85SLoGin return Ok((0, 0)); 28245626c85SLoGin } 28345626c85SLoGin 28445626c85SLoGin while idx < inner.initial_memory_regions_num { 28545626c85SLoGin let range_base = inner.initial_memory_regions[idx].base; 28645626c85SLoGin let range_end = range_base + inner.initial_memory_regions[idx].size; 28745626c85SLoGin 28845626c85SLoGin if range_base >= end { 28945626c85SLoGin break; 29045626c85SLoGin } 29145626c85SLoGin if range_end <= base { 29245626c85SLoGin idx = idx.checked_add(1).unwrap_or(0); 29345626c85SLoGin continue; 29445626c85SLoGin } 29545626c85SLoGin 29645626c85SLoGin if range_base < base { 29745626c85SLoGin // regions[idx] intersects from below 29845626c85SLoGin inner.initial_memory_regions[idx].base = base; 29945626c85SLoGin inner.initial_memory_regions[idx].size -= base - range_base; 300*92849878SLoGin self.do_insert_area( 301*92849878SLoGin inner, 302*92849878SLoGin idx, 303*92849878SLoGin range_base, 304*92849878SLoGin base - range_base, 305*92849878SLoGin inner.initial_memory_regions[idx].flags, 306*92849878SLoGin ); 30745626c85SLoGin } else if range_end > end { 30845626c85SLoGin // regions[idx] intersects from above 30945626c85SLoGin inner.initial_memory_regions[idx].base = end; 31045626c85SLoGin inner.initial_memory_regions[idx].size -= end - range_base; 31145626c85SLoGin 312*92849878SLoGin self.do_insert_area( 313*92849878SLoGin inner, 314*92849878SLoGin idx, 315*92849878SLoGin range_base, 316*92849878SLoGin end - range_base, 317*92849878SLoGin inner.initial_memory_regions[idx].flags, 318*92849878SLoGin ); 31945626c85SLoGin if idx == 0 { 32045626c85SLoGin idx = usize::MAX; 32145626c85SLoGin } else { 32245626c85SLoGin idx -= 1; 32345626c85SLoGin } 32445626c85SLoGin } else { 32545626c85SLoGin // regions[idx] is inside the range, record it 32645626c85SLoGin if end_index == 0 { 32745626c85SLoGin start_index = idx; 32845626c85SLoGin } 32945626c85SLoGin end_index = idx + 1; 33045626c85SLoGin } 33145626c85SLoGin 33245626c85SLoGin idx = idx.checked_add(1).unwrap_or(0); 33345626c85SLoGin } 33445626c85SLoGin 33545626c85SLoGin return Ok((start_index, end_index)); 33645626c85SLoGin } 33745626c85SLoGin 338*92849878SLoGin /// mark_nomap - 用`MemoryAreaAttr::NOMAP`标志标记内存区域 339*92849878SLoGin /// 340*92849878SLoGin /// ## 参数 341*92849878SLoGin /// 342*92849878SLoGin /// - base: 区域的物理基地址 343*92849878SLoGin /// - size: 区域的大小 344*92849878SLoGin /// 345*92849878SLoGin /// 使用`MemoryAreaAttr::NOMAP`标志标记的内存区域将不会被添加到物理内存的直接映射中。这些区域仍然会被内存映射所覆盖。内存映射中代表NOMAP内存帧的struct page将被PageReserved()。 346*92849878SLoGin /// 注意:如果被标记为`MemoryAreaAttr::NOMAP`的内存是从memblock分配的,调用者必须忽略该内存 347*92849878SLoGin pub fn mark_nomap(&self, base: PhysAddr, size: usize) -> Result<(), SystemError> { 348*92849878SLoGin return self.set_or_clear_flags(base, size, true, MemoryAreaAttr::NOMAP); 349*92849878SLoGin } 350*92849878SLoGin 351*92849878SLoGin fn set_or_clear_flags( 352*92849878SLoGin &self, 353*92849878SLoGin base: PhysAddr, 354*92849878SLoGin size: usize, 355*92849878SLoGin set: bool, 356*92849878SLoGin flags: MemoryAreaAttr, 357*92849878SLoGin ) -> Result<(), SystemError> { 358*92849878SLoGin let mut inner = self.inner.lock(); 359*92849878SLoGin let (start_index, end_index) = self.isolate_range(&mut inner, base, size)?; 360*92849878SLoGin for i in start_index..end_index { 361*92849878SLoGin if set { 362*92849878SLoGin inner.initial_memory_regions[i].flags |= flags; 363*92849878SLoGin } else { 364*92849878SLoGin inner.initial_memory_regions[i].flags &= !flags; 365*92849878SLoGin } 366*92849878SLoGin } 367*92849878SLoGin 368*92849878SLoGin let num = inner.initial_memory_regions_num as isize; 369*92849878SLoGin self.do_merge_blocks(&mut inner, 0, num); 370*92849878SLoGin return Ok(()); 371*92849878SLoGin } 372*92849878SLoGin 373*92849878SLoGin /// 标记内存区域为保留区域 374*92849878SLoGin pub fn reserve_block(&self, base: PhysAddr, size: usize) -> Result<(), SystemError> { 375*92849878SLoGin return self.set_or_clear_flags(base, size, true, MemoryAreaAttr::RESERVED); 376*92849878SLoGin } 377*92849878SLoGin 37845626c85SLoGin /// 生成迭代器 37945626c85SLoGin pub fn to_iter(&self) -> MemBlockIter { 38045626c85SLoGin let inner = self.inner.lock(); 38145626c85SLoGin return MemBlockIter { inner, index: 0 }; 38245626c85SLoGin } 38345626c85SLoGin 38445626c85SLoGin /// 获取初始内存区域数量 38545626c85SLoGin pub fn total_initial_memory_regions(&self) -> usize { 38645626c85SLoGin let inner = self.inner.lock(); 38745626c85SLoGin return inner.initial_memory_regions_num; 38845626c85SLoGin } 38945626c85SLoGin 39045626c85SLoGin /// 根据索引获取初始内存区域 39145626c85SLoGin pub fn get_initial_memory_region(&self, index: usize) -> Option<PhysMemoryArea> { 39245626c85SLoGin let inner = self.inner.lock(); 39345626c85SLoGin return inner.initial_memory_regions.get(index).copied(); 39445626c85SLoGin } 39545626c85SLoGin } 39645626c85SLoGin 39745626c85SLoGin pub struct MemBlockIter<'a> { 39845626c85SLoGin inner: SpinLockGuard<'a, InnerMemBlockManager>, 39945626c85SLoGin index: usize, 40045626c85SLoGin } 40145626c85SLoGin 40245626c85SLoGin #[allow(dead_code)] 40345626c85SLoGin impl<'a> MemBlockIter<'a> { 40445626c85SLoGin /// 获取内存区域数量 40545626c85SLoGin pub fn total_num(&self) -> usize { 40645626c85SLoGin self.inner.initial_memory_regions_num 40745626c85SLoGin } 40845626c85SLoGin 40945626c85SLoGin /// 获取指定索引的内存区域 41045626c85SLoGin pub fn get_area(&self, index: usize) -> &PhysMemoryArea { 41145626c85SLoGin &self.inner.initial_memory_regions[index] 41245626c85SLoGin } 41345626c85SLoGin 41445626c85SLoGin /// 获取当前索引 41545626c85SLoGin pub fn current_index(&self) -> usize { 41645626c85SLoGin self.index 41745626c85SLoGin } 41845626c85SLoGin } 41945626c85SLoGin 42045626c85SLoGin impl<'a> Iterator for MemBlockIter<'a> { 42145626c85SLoGin type Item = PhysMemoryArea; 42245626c85SLoGin 42345626c85SLoGin fn next(&mut self) -> Option<Self::Item> { 42445626c85SLoGin if self.index >= self.inner.initial_memory_regions_num { 42545626c85SLoGin return None; 42645626c85SLoGin } 42745626c85SLoGin let ret = self.inner.initial_memory_regions[self.index]; 42845626c85SLoGin self.index += 1; 42945626c85SLoGin return Some(ret); 43045626c85SLoGin } 43145626c85SLoGin } 432*92849878SLoGin 433*92849878SLoGin bitflags! { 434*92849878SLoGin /// 内存区域属性 435*92849878SLoGin pub struct MemoryAreaAttr: u32 { 436*92849878SLoGin /// No special request 437*92849878SLoGin const NONE = 0x0; 438*92849878SLoGin /// Hotpluggable region 439*92849878SLoGin const HOTPLUG = (1 << 0); 440*92849878SLoGin /// Mirrored region 441*92849878SLoGin const MIRROR = (1 << 1); 442*92849878SLoGin /// do not add to kenrel direct mapping 443*92849878SLoGin const NOMAP = (1 << 2); 444*92849878SLoGin /// Always detected via a driver 445*92849878SLoGin const DRIVER_MANAGED = (1 << 3); 446*92849878SLoGin /// Memory is reserved 447*92849878SLoGin const RESERVED = (1 << 4); 448*92849878SLoGin } 449*92849878SLoGin } 450