Browse Source

Kernel: Make KBuffer lazily populated

KBuffers are now zero-filled on demand instead of up front. This means
that you can create a huge KBuffer and it will only take up VM, not
physical pages (until you access them.)
Andreas Kling 6 năm trước cách đây
mục cha
commit
c973a51a23
3 tập tin đã thay đổi với 5 bổ sung4 xóa
  1. 1 1
      Kernel/KBuffer.h
  2. 3 2
      Kernel/VM/MemoryManager.cpp
  3. 1 1
      Kernel/VM/MemoryManager.h

+ 1 - 1
Kernel/KBuffer.h

@@ -19,7 +19,7 @@ class KBufferImpl : public RefCounted<KBufferImpl> {
 public:
     static NonnullRefPtr<KBufferImpl> create_with_size(size_t size)
     {
-        auto region = MM.allocate_kernel_region(PAGE_ROUND_UP(size), "KBuffer");
+        auto region = MM.allocate_kernel_region(PAGE_ROUND_UP(size), "KBuffer", false, false);
         ASSERT(region);
         return adopt(*new KBufferImpl(*region, size));
     }

+ 3 - 2
Kernel/VM/MemoryManager.cpp

@@ -461,7 +461,7 @@ PageFaultResponse MemoryManager::handle_page_fault(const PageFault& fault)
     return PageFaultResponse::ShouldCrash;
 }
 
-RefPtr<Region> MemoryManager::allocate_kernel_region(size_t size, const StringView& name, bool user_accessible)
+RefPtr<Region> MemoryManager::allocate_kernel_region(size_t size, const StringView& name, bool user_accessible, bool should_commit)
 {
     InterruptDisabler disabler;
     ASSERT(!(size % PAGE_SIZE));
@@ -474,7 +474,8 @@ RefPtr<Region> MemoryManager::allocate_kernel_region(size_t size, const StringVi
         region = Region::create_kernel_only(range, name, PROT_READ | PROT_WRITE | PROT_EXEC, false);
     MM.map_region_at_address(*m_kernel_page_directory, *region, range.base());
     // FIXME: It would be cool if these could zero-fill on demand instead.
-    region->commit();
+    if (should_commit)
+        region->commit();
     return region;
 }
 

+ 1 - 1
Kernel/VM/MemoryManager.h

@@ -71,7 +71,7 @@ public:
 
     void map_for_kernel(VirtualAddress, PhysicalAddress);
 
-    RefPtr<Region> allocate_kernel_region(size_t, const StringView& name, bool user_accessible = false);
+    RefPtr<Region> allocate_kernel_region(size_t, const StringView& name, bool user_accessible = false, bool should_commit = true);
     RefPtr<Region> allocate_user_accessible_kernel_region(size_t, const StringView& name);
     void map_region_at_address(PageDirectory&, Region&, VirtualAddress);