The Pedigree Project 0.1
Classes | Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes | Friends | List of all members
AnonymousMemoryMap Class Reference

#include <MemoryMappedFile.h>

+ Inheritance diagram for AnonymousMemoryMap:
+ Collaboration diagram for AnonymousMemoryMap:

Classes

struct  Page
 

Public Member Functions

 AnonymousMemoryMap (uintptr_t address, size_t length, Permissions perms)
 
virtual MemoryMappedObject * clone () override
 
virtual MemoryMappedObject * split (uintptr_t at) override
 
MemoryMappedObject * stageSlice (uintptr_t source, size_t sourceLength, uintptr_t destination, size_t destinationLength) override
 
void releaseDetachedPage (uintptr_t oldAddress, const VirtualAddressSpace::DetachedPage &page) override
 
void discardRange (VirtualAddressSpace &space, uintptr_t base, size_t length) override
 
virtual bool remove (size_t length) override
 
virtual void setPermissions (MemoryMappedObject::Permissions perms) override
 
virtual void unmap () override
 
virtual bool trap (VirtualAddressSpace &space, uintptr_t address, bool bWrite, PopulationStatus *population=nullptr) override
 
bool supportsPageOut (VirtualAddressSpace &space, uintptr_t address) override
 
SwapStatus pageOutAt (VirtualAddressSpace &space, uintptr_t address, bool &released) override
 
bool reclaimAnonymousPage (VirtualAddressSpace &space) override
 
SwapStatus restoreSwapPages (VirtualAddressSpace &space) override
 
PopulationStatus prepareResidentAccess (VirtualAddressSpace &space, uintptr_t address) override
 
- Public Member Functions inherited from MemoryMappedObject
 MemoryMappedObject (uintptr_t address, bool bCopyOnWrite, size_t length, Permissions perms, Permissions maximumPerms=Read|Write|Exec)
 
void setMappingOwnership (bool ownsMappings)
 
virtual File * backingFile () const
 
virtual bool backingRangeValid (uintptr_t source, size_t length) const
 
virtual bool resident (VirtualAddressSpace &space, uintptr_t address, FileResidencyAccess access, void *credentials)
 
virtual bool preparePermissions (uintptr_t base, size_t length, Permissions perms)
 
virtual bool sync (uintptr_t at, bool async)
 
virtual bool syncRange (uintptr_t at, size_t length, bool async)
 
virtual void invalidate (uintptr_t at)
 
virtual bool sharedBacking (uintptr_t at, uintptr_t &identity, size_t &offset) const
 
virtual bool usesBacking (uintptr_t identity) const
 
virtual bool beyondBackingEnd (uintptr_t at) const
 
virtual void discardFilePages (VirtualAddressSpace &space, size_t end)
 
PopulationStatus populatePage (VirtualAddressSpace &space, uintptr_t address)
 
MemoryLockMode lockMode () const
 
virtual bool compact ()
 
bool matches (uintptr_t address)
 
uintptr_t address () const
 
size_t length () const
 
Permissions permissions () const
 
Permissions maximumPermissions () const
 

Private Member Functions

bool pageOut (VirtualAddressSpace &space)
 
SwapStatus restorePage (VirtualAddressSpace &space, Page &page)
 
SwapStatus restoreAll (VirtualAddressSpace &space)
 
void unmapUnlocked ()
 

Static Private Member Functions

static bool initialisePhysicalPage (physical_uintptr_t physical)
 

Private Attributes

Tree< uintptr_t, Page > m_Mappings
 

Static Private Attributes

static physical_uintptr_t m_Zero = 0
 

Friends

class MemoryMapManager
 

Additional Inherited Members

- Public Types inherited from MemoryMappedObject
typedef int Permissions
 
- Static Public Attributes inherited from MemoryMappedObject
static const int None = 0x0
 
static const int Read = 0x1
 
static const int Write = 0x2
 
static const int Exec = 0x4
 
- Protected Attributes inherited from MemoryMappedObject
bool m_bCopyOnWrite
 
uintptr_t m_Address
 
size_t m_Length
 
Permissions m_Permissions
 
Permissions m_MaximumPermissions
 
SharedPointer< MappingAttachment > m_Attachment
 
Process * m_OwnerProcess
 
bool m_OwnsMappings
 
MemoryLockMode m_LockMode
 

Detailed Description

Anonymous memory map object.

Anonymous memory maps do not map back to an actual file; they back onto a common page full of zeroes with forced copy-on-write. This is perfect for mapping in large .bss sections in binaries or for getting huge amounts of zeroed memory.

Definition at line 382 of file MemoryMappedFile.h.

Constructor & Destructor Documentation

◆ AnonymousMemoryMap()

AnonymousMemoryMap::AnonymousMemoryMap ( uintptr_t  address,
size_t  length,
MemoryMappedObject::Permissions  perms 
)

Definition at line 140 of file MemoryMappedFile.cc.

◆ ~AnonymousMemoryMap()

AnonymousMemoryMap::~AnonymousMemoryMap ( )
overridevirtual

Definition at line 60 of file MemoryMappedAnonymous.cc.

Member Function Documentation

◆ clone()

MemoryMappedObject * AnonymousMemoryMap::clone ( )
overridevirtual

Clones the existing metadata of this object into another.

Returns a MemoryMappedObject that exactly matches this one, but which can be used for reference in a new address space. Used for address space clones.

Note that mappings are automatically cloned - only clone metadata in this method.

Implements MemoryMappedObject.

Definition at line 71 of file MemoryMappedAnonymous.cc.

References MemoryMappedObject::address(), MemoryMapManager::instance(), MemoryMappedObject::m_Address, MemoryMappedObject::m_Length, and MemoryMappedObject::m_Permissions.

◆ discardRange()

void AnonymousMemoryMap::discardRange ( VirtualAddressSpace &  space,
uintptr_t  base,
size_t  length 
)
overridevirtual

Implements MemoryMappedObject.

Definition at line 159 of file MemoryMappedAnonymous.cc.

◆ initialisePhysicalPage()

bool AnonymousMemoryMap::initialisePhysicalPage ( physical_uintptr_t  physical)
staticprivate

Definition at line 165 of file MemoryMappedFile.cc.

◆ pageOut()

bool AnonymousMemoryMap::pageOut ( VirtualAddressSpace &  space)
private

Definition at line 409 of file MemoryMappedAnonymous.cc.

◆ pageOutAt()

SwapStatus AnonymousMemoryMap::pageOutAt ( VirtualAddressSpace &  space,
uintptr_t  address,
bool &  released 
)
overridevirtual

Reimplemented from MemoryMappedObject.

Definition at line 372 of file MemoryMappedAnonymous.cc.

◆ prepareResidentAccess()

PopulationStatus AnonymousMemoryMap::prepareResidentAccess ( VirtualAddressSpace &  space,
uintptr_t  address 
)
overridevirtual

Reimplemented from MemoryMappedObject.

Definition at line 439 of file MemoryMappedAnonymous.cc.

◆ reclaimAnonymousPage()

bool AnonymousMemoryMap::reclaimAnonymousPage ( VirtualAddressSpace &  space)
inlineoverridevirtual

Reimplemented from MemoryMappedObject.

Definition at line 408 of file MemoryMappedFile.h.

◆ releaseDetachedPage()

void AnonymousMemoryMap::releaseDetachedPage ( uintptr_t  oldAddress,
const VirtualAddressSpace::DetachedPage &  page 
)
overridevirtual

Implements MemoryMappedObject.

Definition at line 148 of file MemoryMappedAnonymous.cc.

◆ remove()

bool AnonymousMemoryMap::remove ( size_t  length)
overridevirtual

Removes pages from the start of this MemoryMappedObject.

To remove pages from the middle or end of a MemoryMappedObject, use split() and then remove()/unmap() on the returned object).

Returns
true if the remove() has effectively removed the entire MemoryMappedObject, false otherwise.

Implements MemoryMappedObject.

Definition at line 186 of file MemoryMappedAnonymous.cc.

References PhysicalMemoryManager::getPageSize(), ProcessorBase::information(), MemoryMapManager::instance(), MemoryMappedObject::length(), MemoryMappedObject::m_Address, and MemoryMappedObject::m_Length.

◆ restoreAll()

SwapStatus AnonymousMemoryMap::restoreAll ( VirtualAddressSpace &  space)
private

Definition at line 427 of file MemoryMappedAnonymous.cc.

◆ restorePage()

SwapStatus AnonymousMemoryMap::restorePage ( VirtualAddressSpace &  space,
Page &  page 
)
private

Definition at line 227 of file MemoryMappedAnonymous.cc.

◆ restoreSwapPages()

SwapStatus AnonymousMemoryMap::restoreSwapPages ( VirtualAddressSpace &  space)
inlineoverridevirtual

Reimplemented from MemoryMappedObject.

Definition at line 411 of file MemoryMappedFile.h.

◆ setPermissions()

void AnonymousMemoryMap::setPermissions ( MemoryMappedObject::Permissions  perms)
overridevirtual

◆ split()

MemoryMappedObject * AnonymousMemoryMap::split ( uintptr_t  at)
overridevirtual

Splits the metadata of this object at the given address and creates a new MemoryMappedObject that begins at the page of the split.

Implements MemoryMappedObject.

Definition at line 132 of file MemoryMappedAnonymous.cc.

References MemoryMappedObject::address(), MemoryMapManager::instance(), MemoryMappedObject::m_Address, MemoryMappedObject::m_Length, and stageSlice().

◆ stageSlice()

MemoryMappedObject * AnonymousMemoryMap::stageSlice ( uintptr_t  source,
size_t  sourceLength,
uintptr_t  destination,
size_t  destinationLength 
)
overridevirtual

Prepared slices transfer existing page ownership only after publication.

Implements MemoryMappedObject.

Definition at line 102 of file MemoryMappedAnonymous.cc.

References MemoryMappedObject::address(), MemoryMapManager::instance(), MemoryMappedObject::m_Address, MemoryMappedObject::m_bCopyOnWrite, MemoryMappedObject::m_Length, and MemoryMappedObject::m_Permissions.

Referenced by split().

+ Here is the caller graph for this function:

◆ supportsPageOut()

bool AnonymousMemoryMap::supportsPageOut ( VirtualAddressSpace &  space,
uintptr_t  address 
)
overridevirtual

◆ trap()

bool AnonymousMemoryMap::trap ( VirtualAddressSpace &  space,
uintptr_t  address,
bool  bWrite,
PopulationStatus *  population = nullptr 
)
overridevirtual

Trap entry

Implement this in your implementation to actually perform the mapping of memory into the address space.

Returns
true if the trap was successful, false otherwise.

Implements MemoryMappedObject.

Definition at line 263 of file MemoryMappedAnonymous.cc.

References MemoryMappedObject::address(), VirtualAddressSpace::Execute, PhysicalMemoryManager::getPageSize(), MemoryMapManager::instance(), PhysicalMemoryManager::instance(), VirtualAddressSpace::isMapped(), MemoryMappedObject::m_Permissions, VirtualAddressSpace::map(), VirtualAddressSpace::Shared, and VirtualAddressSpace::unmap().

◆ unmap()

void AnonymousMemoryMap::unmap ( )
overridevirtual

Unmaps existing mappings in this object from the address space.

Implementations are expected to track these as necessary for the implementation.

Implements MemoryMappedObject.

Definition at line 218 of file MemoryMappedAnonymous.cc.

References MemoryMapManager::instance().

◆ unmapUnlocked()

void AnonymousMemoryMap::unmapUnlocked ( )
private

Definition at line 222 of file MemoryMappedAnonymous.cc.

Friends And Related Symbol Documentation

◆ MemoryMapManager

friend class MemoryMapManager
friend

Definition at line 417 of file MemoryMappedFile.h.

Member Data Documentation

◆ m_Mappings

Tree<uintptr_t, Page> AnonymousMemoryMap::m_Mappings
private

Definition at line 432 of file MemoryMappedFile.h.

◆ m_Zero

physical_uintptr_t AnonymousMemoryMap::m_Zero = 0
staticprivate

Definition at line 426 of file MemoryMappedFile.h.


The documentation for this class was generated from the following files: