diff --git a/Kernel/VM/MemoryManager.cpp b/Kernel/VM/MemoryManager.cpp index e007e2cfec..0bbdb32405 100644 --- a/Kernel/VM/MemoryManager.cpp +++ b/Kernel/VM/MemoryManager.cpp @@ -174,8 +174,6 @@ bool MemoryManager::is_allowed_to_mmap_to_userspace(PhysicalAddress start_addres UNMAP_AFTER_INIT void MemoryManager::parse_memory_map() { - PhysicalRegion* physical_region { nullptr }; - // Register used memory regions that we know of. m_used_memory_ranges.ensure_capacity(4); m_used_memory_ranges.append(UsedMemoryRange { UsedMemoryRangeType::LowMemory, PhysicalAddress(0x00000000), PhysicalAddress(1 * MiB) }); @@ -193,6 +191,13 @@ UNMAP_AFTER_INIT void MemoryManager::parse_memory_map() auto* mmap_begin = reinterpret_cast(low_physical_to_virtual(multiboot_info_ptr->mmap_addr)); auto* mmap_end = reinterpret_cast(low_physical_to_virtual(multiboot_info_ptr->mmap_addr) + multiboot_info_ptr->mmap_length); + struct ContiguousPhysicalRange { + PhysicalAddress lower; + PhysicalAddress upper; + }; + + Vector contiguous_physical_ranges; + for (auto* mmap = mmap_begin; mmap < mmap_end; mmap++) { dmesgln("MM: Multiboot mmap: address={:p}, length={}, type={}", mmap->addr, mmap->len, mmap->type); @@ -255,16 +260,21 @@ UNMAP_AFTER_INIT void MemoryManager::parse_memory_map() if (should_skip) continue; - // Assign page to user physical physical_region. - if (!physical_region || physical_region->upper().offset(PAGE_SIZE) != addr) { - m_user_physical_regions.append(PhysicalRegion::try_create(addr, addr).release_nonnull()); - physical_region = &m_user_physical_regions.last(); + if (contiguous_physical_ranges.is_empty() || contiguous_physical_ranges.last().upper.offset(PAGE_SIZE) != addr) { + contiguous_physical_ranges.append(ContiguousPhysicalRange { + .lower = addr, + .upper = addr, + }); } else { - physical_region->expand(physical_region->lower(), addr); + contiguous_physical_ranges.last().upper = addr; } } } + for (auto& range : contiguous_physical_ranges) { + m_user_physical_regions.append(PhysicalRegion::try_create(range.lower, range.upper).release_nonnull()); + } + // Append statically-allocated super physical physical_region. m_super_physical_regions.append(PhysicalRegion::try_create( PhysicalAddress(virtual_to_low_physical(FlatPtr(super_pages))), diff --git a/Kernel/VM/PhysicalRegion.cpp b/Kernel/VM/PhysicalRegion.cpp index 0628bf99bd..2f0ed7c634 100644 --- a/Kernel/VM/PhysicalRegion.cpp +++ b/Kernel/VM/PhysicalRegion.cpp @@ -36,14 +36,6 @@ PhysicalRegion::PhysicalRegion(PhysicalAddress lower, PhysicalAddress upper) { } -void PhysicalRegion::expand(PhysicalAddress lower, PhysicalAddress upper) -{ - VERIFY(!m_pages); - - m_lower = lower; - m_upper = upper; -} - void PhysicalRegion::initialize_zones() { size_t remaining_pages = m_pages; @@ -65,9 +57,7 @@ void PhysicalRegion::initialize_zones() unsigned PhysicalRegion::finalize_capacity() { VERIFY(!m_pages); - m_pages = (m_upper.get() - m_lower.get()) / PAGE_SIZE; - return size(); } diff --git a/Kernel/VM/PhysicalRegion.h b/Kernel/VM/PhysicalRegion.h index d59868488f..7b5d085dea 100644 --- a/Kernel/VM/PhysicalRegion.h +++ b/Kernel/VM/PhysicalRegion.h @@ -25,7 +25,6 @@ public: ~PhysicalRegion(); - void expand(PhysicalAddress lower, PhysicalAddress upper); unsigned finalize_capacity(); void initialize_zones();