mirror of
https://github.com/SerenityOS/serenity.git
synced 2025-01-24 18:32:28 -05:00
cdab5b2091
When booting AP's, we identity map a region at 0x8000 while doing the initial bringup sequence. This is the only thing in the kernel that requires an identity mapping, yet we had a bunch of generic API's and a dedicated VirtualRangeAllocator in every PageDirectory for this purpose. This patch simplifies the situation by moving the identity mapping logic to the AP boot code and removing the generic API's.
67 lines
1.7 KiB
C++
67 lines
1.7 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/HashMap.h>
|
|
#include <AK/RefCounted.h>
|
|
#include <AK/RefPtr.h>
|
|
#include <Kernel/Forward.h>
|
|
#include <Kernel/Memory/PhysicalPage.h>
|
|
#include <Kernel/Memory/VirtualRangeAllocator.h>
|
|
|
|
namespace Kernel::Memory {
|
|
|
|
class PageDirectory : public RefCounted<PageDirectory> {
|
|
friend class MemoryManager;
|
|
|
|
public:
|
|
static RefPtr<PageDirectory> try_create_for_userspace(VirtualRangeAllocator const* parent_range_allocator = nullptr);
|
|
static NonnullRefPtr<PageDirectory> must_create_kernel_page_directory();
|
|
static RefPtr<PageDirectory> find_by_cr3(FlatPtr);
|
|
|
|
~PageDirectory();
|
|
|
|
void allocate_kernel_directory();
|
|
|
|
FlatPtr cr3() const
|
|
{
|
|
#if ARCH(X86_64)
|
|
return m_pml4t->paddr().get();
|
|
#else
|
|
return m_directory_table->paddr().get();
|
|
#endif
|
|
}
|
|
|
|
VirtualRangeAllocator& range_allocator() { return m_range_allocator; }
|
|
VirtualRangeAllocator const& range_allocator() const { return m_range_allocator; }
|
|
|
|
AddressSpace* address_space() { return m_space; }
|
|
const AddressSpace* address_space() const { return m_space; }
|
|
|
|
void set_space(Badge<AddressSpace>, AddressSpace& space) { m_space = &space; }
|
|
|
|
RecursiveSpinLock& get_lock() { return m_lock; }
|
|
|
|
private:
|
|
PageDirectory();
|
|
|
|
AddressSpace* m_space { nullptr };
|
|
VirtualRangeAllocator m_range_allocator;
|
|
#if ARCH(X86_64)
|
|
RefPtr<PhysicalPage> m_pml4t;
|
|
#endif
|
|
RefPtr<PhysicalPage> m_directory_table;
|
|
#if ARCH(X86_64)
|
|
RefPtr<PhysicalPage> m_directory_pages[512];
|
|
#else
|
|
RefPtr<PhysicalPage> m_directory_pages[4];
|
|
#endif
|
|
HashMap<FlatPtr, RefPtr<PhysicalPage>> m_page_tables;
|
|
RecursiveSpinLock m_lock;
|
|
};
|
|
|
|
}
|