forked from Bananymous/banan-os
On-demand paging has not been used ever since I made userspace stack be a normal MemoryRegion.
44 lines
1.3 KiB
C++
44 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include <BAN/NoCopyMove.h>
|
|
#include <BAN/UniqPtr.h>
|
|
#include <BAN/Vector.h>
|
|
#include <kernel/Memory/PageTable.h>
|
|
|
|
namespace Kernel
|
|
{
|
|
|
|
class VirtualRange
|
|
{
|
|
BAN_NON_COPYABLE(VirtualRange);
|
|
BAN_NON_MOVABLE(VirtualRange);
|
|
|
|
public:
|
|
static BAN::ErrorOr<BAN::UniqPtr<VirtualRange>> create_to_vaddr_range(PageTable&, AddressRange address_range, size_t, PageTable::flags_t flags, bool add_guard_pages);
|
|
~VirtualRange();
|
|
|
|
vaddr_t vaddr() const { return m_vaddr + (m_has_guard_pages ? PAGE_SIZE : 0); }
|
|
size_t size() const { return m_size - (m_has_guard_pages ? 2 * PAGE_SIZE : 0); }
|
|
PageTable::flags_t flags() const { return m_flags; }
|
|
|
|
paddr_t paddr_of(vaddr_t vaddr) const { return m_page_table.physical_address_of(vaddr & PAGE_ADDR_MASK); }
|
|
|
|
bool contains(vaddr_t address) const { return vaddr() <= address && address < vaddr() + size(); }
|
|
|
|
private:
|
|
VirtualRange(PageTable&, bool has_guard_pages, vaddr_t, size_t, PageTable::flags_t);
|
|
BAN::ErrorOr<void> initialize();
|
|
|
|
private:
|
|
PageTable& m_page_table;
|
|
const bool m_has_guard_pages;
|
|
const vaddr_t m_vaddr;
|
|
const size_t m_size;
|
|
const PageTable::flags_t m_flags;
|
|
SpinLock m_lock;
|
|
|
|
friend class BAN::UniqPtr<VirtualRange>;
|
|
};
|
|
|
|
}
|