mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 20:27:45 +00:00
Kernel: Store VMObject physical pages in a FixedArray
Let's enforce the invariant that VMObjects don't shrink or grow by storing the pages in a FixedArray.
This commit is contained in:
parent
373b8d7cfa
commit
59049ae4b7
3 changed files with 6 additions and 11 deletions
|
@ -117,11 +117,11 @@ AnonymousVMObject::AnonymousVMObject(PhysicalPage& page)
|
||||||
}
|
}
|
||||||
|
|
||||||
AnonymousVMObject::AnonymousVMObject(NonnullRefPtrVector<PhysicalPage> physical_pages)
|
AnonymousVMObject::AnonymousVMObject(NonnullRefPtrVector<PhysicalPage> physical_pages)
|
||||||
: VMObject()
|
: VMObject(physical_pages.size())
|
||||||
, m_volatile_ranges_cache({ 0, page_count() })
|
, m_volatile_ranges_cache({ 0, page_count() })
|
||||||
{
|
{
|
||||||
for (auto& page : physical_pages) {
|
for (size_t i = 0; i < physical_pages.size(); ++i) {
|
||||||
m_physical_pages.append(page);
|
m_physical_pages[i] = physical_pages[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,14 +15,9 @@ VMObject::VMObject(const VMObject& other)
|
||||||
MM.register_vmobject(*this);
|
MM.register_vmobject(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
VMObject::VMObject()
|
|
||||||
{
|
|
||||||
MM.register_vmobject(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
VMObject::VMObject(size_t size)
|
VMObject::VMObject(size_t size)
|
||||||
|
: m_physical_pages(ceil_div(size, static_cast<size_t>(PAGE_SIZE)))
|
||||||
{
|
{
|
||||||
m_physical_pages.resize(ceil_div(size, static_cast<size_t>(PAGE_SIZE)));
|
|
||||||
MM.register_vmobject(*this);
|
MM.register_vmobject(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <AK/FixedArray.h>
|
||||||
#include <AK/HashTable.h>
|
#include <AK/HashTable.h>
|
||||||
#include <AK/IntrusiveList.h>
|
#include <AK/IntrusiveList.h>
|
||||||
#include <AK/RefCounted.h>
|
#include <AK/RefCounted.h>
|
||||||
|
@ -61,7 +62,6 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
VMObject();
|
|
||||||
explicit VMObject(size_t);
|
explicit VMObject(size_t);
|
||||||
explicit VMObject(const VMObject&);
|
explicit VMObject(const VMObject&);
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ protected:
|
||||||
void for_each_region(Callback);
|
void for_each_region(Callback);
|
||||||
|
|
||||||
IntrusiveListNode<VMObject> m_list_node;
|
IntrusiveListNode<VMObject> m_list_node;
|
||||||
Vector<RefPtr<PhysicalPage>, 16> m_physical_pages;
|
FixedArray<RefPtr<PhysicalPage>> m_physical_pages;
|
||||||
Lock m_paging_lock { "VMObject" };
|
Lock m_paging_lock { "VMObject" };
|
||||||
|
|
||||||
mutable SpinLock<u8> m_lock;
|
mutable SpinLock<u8> m_lock;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue