mirror of
https://github.com/RGBCube/serenity
synced 2025-05-16 20:15:07 +00:00
Kernel: Use a shared physical page for zero-filled pages until written
This patch adds a globally shared zero-filled PhysicalPage that will be mapped into every slot of every zero-filled AnonymousVMObject until that page is written to, achieving CoW-like zero-filled pages. Initial testing show that this doesn't actually achieve any sharing yet but it seems like a good design regardless, since it may reduce the number of page faults taken by programs. If you look at the refcount of MM.shared_zero_page() it will have quite a high refcount, but that's just because everything maps it everywhere. If you want to see the "real" refcount, you can build with the MAP_SHARED_ZERO_PAGE_LAZILY flag, and we'll defer mapping of the shared zero page until the first NP read fault. I've left this behavior behind a flag for future testing of this code.
This commit is contained in:
parent
a4d857e3c5
commit
c624d3875e
5 changed files with 41 additions and 8 deletions
|
@ -53,6 +53,8 @@ MemoryManager::MemoryManager()
|
|||
write_cr3(kernel_page_directory().cr3());
|
||||
setup_low_identity_mapping();
|
||||
protect_kernel_image();
|
||||
|
||||
m_shared_zero_page = allocate_user_physical_page();
|
||||
}
|
||||
|
||||
MemoryManager::~MemoryManager()
|
||||
|
@ -297,7 +299,7 @@ OwnPtr<Region> MemoryManager::allocate_kernel_region(size_t size, const StringVi
|
|||
region = Region::create_user_accessible(range, name, access, cacheable);
|
||||
else
|
||||
region = Region::create_kernel_only(range, name, access, cacheable);
|
||||
region->set_page_directory(kernel_page_directory());
|
||||
region->map(kernel_page_directory());
|
||||
if (should_commit)
|
||||
region->commit();
|
||||
return region;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue