Prechádzať zdrojové kódy

Kernel: Regions should be mapped into a PageDirectory, not a Process

This patch changes the parameter to Region::map() to be a PageDirectory
since that matches how we think about the memory model:

Regions are views onto VMObjects, and are mapped into PageDirectories.
Each Process has a PageDirectory. The kernel also has a PageDirectory.
Andreas Kling 5 rokov pred
rodič
commit
3dce0f23f4

+ 5 - 5
Kernel/Process.cpp

@@ -122,7 +122,7 @@ Region* Process::allocate_region(VirtualAddress vaddr, size_t size, const String
     if (!range.is_valid())
     if (!range.is_valid())
         return nullptr;
         return nullptr;
     m_regions.append(Region::create_user_accessible(range, name, prot_to_region_access_flags(prot)));
     m_regions.append(Region::create_user_accessible(range, name, prot_to_region_access_flags(prot)));
-    m_regions.last().map(*this);
+    m_regions.last().map(page_directory());
     if (commit)
     if (commit)
         m_regions.last().commit();
         m_regions.last().commit();
     return &m_regions.last();
     return &m_regions.last();
@@ -134,7 +134,7 @@ Region* Process::allocate_file_backed_region(VirtualAddress vaddr, size_t size,
     if (!range.is_valid())
     if (!range.is_valid())
         return nullptr;
         return nullptr;
     m_regions.append(Region::create_user_accessible(range, inode, name, prot_to_region_access_flags(prot)));
     m_regions.append(Region::create_user_accessible(range, inode, name, prot_to_region_access_flags(prot)));
-    m_regions.last().map(*this);
+    m_regions.last().map(page_directory());
     return &m_regions.last();
     return &m_regions.last();
 }
 }
 
 
@@ -145,7 +145,7 @@ Region* Process::allocate_region_with_vmo(VirtualAddress vaddr, size_t size, Non
         return nullptr;
         return nullptr;
     offset_in_vmo &= PAGE_MASK;
     offset_in_vmo &= PAGE_MASK;
     m_regions.append(Region::create_user_accessible(range, move(vmo), offset_in_vmo, name, prot_to_region_access_flags(prot)));
     m_regions.append(Region::create_user_accessible(range, move(vmo), offset_in_vmo, name, prot_to_region_access_flags(prot)));
-    m_regions.last().map(*this);
+    m_regions.last().map(page_directory());
     return &m_regions.last();
     return &m_regions.last();
 }
 }
 
 
@@ -267,7 +267,7 @@ int Process::sys$munmap(void* addr, size_t size)
 
 
         // And finally we map the new region(s).
         // And finally we map the new region(s).
         for (auto* new_region : new_regions) {
         for (auto* new_region : new_regions) {
-            new_region->map(*this);
+            new_region->map(page_directory());
         }
         }
         return 0;
         return 0;
     }
     }
@@ -313,7 +313,7 @@ Process* Process::fork(RegisterDump& regs)
         dbg() << "fork: cloning Region{" << &region << "} '" << region.name() << "' @ " << region.vaddr();
         dbg() << "fork: cloning Region{" << &region << "} '" << region.name() << "' @ " << region.vaddr();
 #endif
 #endif
         child->m_regions.append(region.clone());
         child->m_regions.append(region.clone());
-        child->m_regions.last().map(*child);
+        child->m_regions.last().map(child->page_directory());
 
 
         if (&region == m_master_tls_region)
         if (&region == m_master_tls_region)
             child->m_master_tls_region = &child->m_regions.last();
             child->m_master_tls_region = &child->m_regions.last();

+ 1 - 1
Kernel/VM/MemoryManager.cpp

@@ -483,7 +483,7 @@ OwnPtr<Region> MemoryManager::allocate_kernel_region(size_t size, const StringVi
         region = Region::create_user_accessible(range, name, PROT_READ | PROT_WRITE | PROT_EXEC);
         region = Region::create_user_accessible(range, name, PROT_READ | PROT_WRITE | PROT_EXEC);
     else
     else
         region = Region::create_kernel_only(range, name, PROT_READ | PROT_WRITE | PROT_EXEC);
         region = Region::create_kernel_only(range, name, PROT_READ | PROT_WRITE | PROT_EXEC);
-    MM.map_region_at_address(*m_kernel_page_directory, *region, range.base());
+    region->map(kernel_page_directory());
     // FIXME: It would be cool if these could zero-fill on demand instead.
     // FIXME: It would be cool if these could zero-fill on demand instead.
     if (should_commit)
     if (should_commit)
         region->commit();
         region->commit();

+ 2 - 2
Kernel/VM/Region.cpp

@@ -216,7 +216,7 @@ void Region::unmap(ShouldDeallocateVirtualMemoryRange deallocate_range)
     release_page_directory();
     release_page_directory();
 }
 }
 
 
-void Region::map(Process& process)
+void Region::map(PageDirectory& page_directory)
 {
 {
-    MM.map_region_at_address(process.page_directory(), *this, vaddr());
+    MM.map_region_at_address(page_directory, *this, vaddr());
 }
 }

+ 1 - 1
Kernel/VM/Region.h

@@ -114,7 +114,7 @@ public:
             m_access &= ~Access::Write;
             m_access &= ~Access::Write;
     }
     }
 
 
-    void map(Process&);
+    void map(PageDirectory&);
     enum class ShouldDeallocateVirtualMemoryRange {
     enum class ShouldDeallocateVirtualMemoryRange {
         No,
         No,
         Yes,
         Yes,