1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 10:18:11 +00:00

Kernel: Add mapping from page directory base (PDB) to PageDirectory

This allows the page fault code to find the owning PageDirectory and
corresponding process for faulting regions.

The mapping is implemented as a global hash map right now, which is
definitely not optimal. We can come up with something better when it
becomes necessary.
This commit is contained in:
Andreas Kling 2019-08-06 11:19:16 +02:00
parent 8d07bce12a
commit 2ad963d261
5 changed files with 60 additions and 16 deletions

View file

@ -6,16 +6,36 @@
static const u32 userspace_range_base = 0x01000000;
static const u32 kernelspace_range_base = 0xc0000000;
static HashMap<u32, PageDirectory*>& pdb_map()
{
ASSERT_INTERRUPTS_DISABLED();
static HashMap<u32, PageDirectory*>* map;
if (!map)
map = new HashMap<u32, PageDirectory*>;
return *map;
}
RefPtr<PageDirectory> PageDirectory::find_by_pdb(u32 pdb)
{
InterruptDisabler disabler;
return pdb_map().get(pdb).value_or({});
}
PageDirectory::PageDirectory(PhysicalAddress paddr)
: m_range_allocator(VirtualAddress(0xc0000000), 0x3f000000)
{
m_directory_page = PhysicalPage::create(paddr, true, false);
InterruptDisabler disabler;
pdb_map().set(m_directory_page->paddr().get(), this);
}
PageDirectory::PageDirectory(const RangeAllocator* parent_range_allocator)
: m_range_allocator(parent_range_allocator ? RangeAllocator(*parent_range_allocator) : RangeAllocator(VirtualAddress(userspace_range_base), kernelspace_range_base - userspace_range_base))
PageDirectory::PageDirectory(Process& process, const RangeAllocator* parent_range_allocator)
: m_process(&process)
, m_range_allocator(parent_range_allocator ? RangeAllocator(*parent_range_allocator) : RangeAllocator(VirtualAddress(userspace_range_base), kernelspace_range_base - userspace_range_base))
{
MM.populate_page_directory(*this);
InterruptDisabler disabler;
pdb_map().set(m_directory_page->paddr().get(), this);
}
PageDirectory::~PageDirectory()
@ -23,6 +43,8 @@ PageDirectory::~PageDirectory()
#ifdef MM_DEBUG
dbgprintf("MM: ~PageDirectory K%x\n", this);
#endif
InterruptDisabler disabler;
pdb_map().remove(m_directory_page->paddr().get());
}
void PageDirectory::flush(VirtualAddress vaddr)