1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-08 22:37:35 +00:00

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.)
This commit is contained in:
Andreas Kling 2019-08-06 14:12:52 +02:00
parent a0bb592b4f
commit c973a51a23
3 changed files with 5 additions and 4 deletions

View file

@ -19,7 +19,7 @@ class KBufferImpl : public RefCounted<KBufferImpl> {
public: public:
static NonnullRefPtr<KBufferImpl> create_with_size(size_t size) 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); ASSERT(region);
return adopt(*new KBufferImpl(*region, size)); return adopt(*new KBufferImpl(*region, size));
} }

View file

@ -461,7 +461,7 @@ PageFaultResponse MemoryManager::handle_page_fault(const PageFault& fault)
return PageFaultResponse::ShouldCrash; 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; InterruptDisabler disabler;
ASSERT(!(size % PAGE_SIZE)); ASSERT(!(size % PAGE_SIZE));
@ -474,6 +474,7 @@ 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); 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()); 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. // FIXME: It would be cool if these could zero-fill on demand instead.
if (should_commit)
region->commit(); region->commit();
return region; return region;
} }

View file

@ -71,7 +71,7 @@ public:
void map_for_kernel(VirtualAddress, PhysicalAddress); 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); RefPtr<Region> allocate_user_accessible_kernel_region(size_t, const StringView& name);
void map_region_at_address(PageDirectory&, Region&, VirtualAddress); void map_region_at_address(PageDirectory&, Region&, VirtualAddress);