|
@@ -113,16 +113,10 @@ struct VirtualMemoryArea {
|
|
|
* - http://duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files/
|
|
* - http://duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files/
|
|
|
*/
|
|
*/
|
|
|
class VMManager final {
|
|
class VMManager final {
|
|
|
|
|
+ using VMAMap = std::map<VAddr, VirtualMemoryArea>;
|
|
|
|
|
+
|
|
|
public:
|
|
public:
|
|
|
- /**
|
|
|
|
|
- * A map covering the entirety of the managed address space, keyed by the `base` field of each
|
|
|
|
|
- * VMA. It must always be modified by splitting or merging VMAs, so that the invariant
|
|
|
|
|
- * `elem.base + elem.size == next.base` is preserved, and mergeable regions must always be
|
|
|
|
|
- * merged when possible so that no two similar and adjacent regions exist that have not been
|
|
|
|
|
- * merged.
|
|
|
|
|
- */
|
|
|
|
|
- std::map<VAddr, VirtualMemoryArea> vma_map;
|
|
|
|
|
- using VMAHandle = decltype(vma_map)::const_iterator;
|
|
|
|
|
|
|
+ using VMAHandle = VMAMap::const_iterator;
|
|
|
|
|
|
|
|
VMManager();
|
|
VMManager();
|
|
|
~VMManager();
|
|
~VMManager();
|
|
@@ -133,6 +127,9 @@ public:
|
|
|
/// Finds the VMA in which the given address is included in, or `vma_map.end()`.
|
|
/// Finds the VMA in which the given address is included in, or `vma_map.end()`.
|
|
|
VMAHandle FindVMA(VAddr target) const;
|
|
VMAHandle FindVMA(VAddr target) const;
|
|
|
|
|
|
|
|
|
|
+ /// Indicates whether or not the given handle is within the VMA map.
|
|
|
|
|
+ bool IsValidHandle(VMAHandle handle) const;
|
|
|
|
|
+
|
|
|
// TODO(yuriks): Should these functions actually return the handle?
|
|
// TODO(yuriks): Should these functions actually return the handle?
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -281,7 +278,7 @@ public:
|
|
|
Memory::PageTable page_table;
|
|
Memory::PageTable page_table;
|
|
|
|
|
|
|
|
private:
|
|
private:
|
|
|
- using VMAIter = decltype(vma_map)::iterator;
|
|
|
|
|
|
|
+ using VMAIter = VMAMap::iterator;
|
|
|
|
|
|
|
|
/// Converts a VMAHandle to a mutable VMAIter.
|
|
/// Converts a VMAHandle to a mutable VMAIter.
|
|
|
VMAIter StripIterConstness(const VMAHandle& iter);
|
|
VMAIter StripIterConstness(const VMAHandle& iter);
|
|
@@ -328,6 +325,15 @@ private:
|
|
|
/// Clears out the page table
|
|
/// Clears out the page table
|
|
|
void ClearPageTable();
|
|
void ClearPageTable();
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * A map covering the entirety of the managed address space, keyed by the `base` field of each
|
|
|
|
|
+ * VMA. It must always be modified by splitting or merging VMAs, so that the invariant
|
|
|
|
|
+ * `elem.base + elem.size == next.base` is preserved, and mergeable regions must always be
|
|
|
|
|
+ * merged when possible so that no two similar and adjacent regions exist that have not been
|
|
|
|
|
+ * merged.
|
|
|
|
|
+ */
|
|
|
|
|
+ VMAMap vma_map;
|
|
|
|
|
+
|
|
|
u32 address_space_width = 0;
|
|
u32 address_space_width = 0;
|
|
|
VAddr address_space_base = 0;
|
|
VAddr address_space_base = 0;
|
|
|
VAddr address_space_end = 0;
|
|
VAddr address_space_end = 0;
|