Documentation ¶
Overview ¶
Package mm provides a memory management subsystem. See README.md for a detailed overview.
Lock order:
fs locks, except for memmap.Mappable locks
mm.MemoryManager.metadataMu mm.MemoryManager.mappingMu Locks taken by memmap.Mappable methods other than Translate mm.MemoryManager.activeMu Locks taken by memmap.Mappable.Translate mm.privateRefs.mu platform.File locks mm.aioManager.mu mm.AIOContext.mu
Only mm.MemoryManager.Fork is permitted to lock mm.MemoryManager.activeMu in multiple mm.MemoryManagers, as it does so in a well-defined order (forked child first).
Index ¶
- type AIOContext
- type MRemapMoveMode
- type MRemapOpts
- type MemoryManager
- func (mm *MemoryManager) Activate() error
- func (mm *MemoryManager) AddressSpace() platform.AddressSpace
- func (mm *MemoryManager) ArgvEnd() usermem.Addr
- func (mm *MemoryManager) ArgvStart() usermem.Addr
- func (mm *MemoryManager) Auxv() arch.Auxv
- func (mm *MemoryManager) Brk(ctx context.Context, addr usermem.Addr) (usermem.Addr, error)
- func (mm *MemoryManager) BrkSetup(ctx context.Context, addr usermem.Addr)
- func (mm *MemoryManager) CompareAndSwapUint32(ctx context.Context, addr usermem.Addr, old, new uint32, opts usermem.IOOpts) (uint32, error)
- func (mm *MemoryManager) CopyIn(ctx context.Context, addr usermem.Addr, dst []byte, opts usermem.IOOpts) (int, error)
- func (mm *MemoryManager) CopyInTo(ctx context.Context, ars usermem.AddrRangeSeq, dst safemem.Writer, ...) (int64, error)
- func (mm *MemoryManager) CopyOut(ctx context.Context, addr usermem.Addr, src []byte, opts usermem.IOOpts) (int, error)
- func (mm *MemoryManager) CopyOutFrom(ctx context.Context, ars usermem.AddrRangeSeq, src safemem.Reader, ...) (int64, error)
- func (mm *MemoryManager) Deactivate() error
- func (mm *MemoryManager) DebugString(ctx context.Context) string
- func (mm *MemoryManager) DecUsers(ctx context.Context)
- func (mm *MemoryManager) Decommit(addr usermem.Addr, length uint64) error
- func (mm *MemoryManager) DestroyAIOContext(ctx context.Context, id uint64) bool
- func (mm *MemoryManager) EnvvEnd() usermem.Addr
- func (mm *MemoryManager) EnvvStart() usermem.Addr
- func (mm *MemoryManager) Executable() *fs.Dirent
- func (mm *MemoryManager) Fork(ctx context.Context) (*MemoryManager, error)
- func (mm *MemoryManager) HandleUserFault(ctx context.Context, addr usermem.Addr, at usermem.AccessType, sp usermem.Addr) error
- func (mm *MemoryManager) IncUsers() bool
- func (mm *MemoryManager) Invalidate(ar usermem.AddrRange, opts memmap.InvalidateOpts)
- func (mm *MemoryManager) InvalidateUnsavable(ctx context.Context) error
- func (mm *MemoryManager) LookupAIOContext(ctx context.Context, id uint64) (*AIOContext, bool)
- func (mm *MemoryManager) MMap(ctx context.Context, opts memmap.MMapOpts) (usermem.Addr, error)
- func (mm *MemoryManager) MProtect(addr usermem.Addr, length uint64, realPerms usermem.AccessType, growsDown bool) error
- func (mm *MemoryManager) MRemap(ctx context.Context, oldAddr usermem.Addr, oldSize uint64, newSize uint64, ...) (usermem.Addr, error)
- func (mm *MemoryManager) MUnmap(ctx context.Context, addr usermem.Addr, length uint64) error
- func (mm *MemoryManager) MapStack(ctx context.Context) (usermem.AddrRange, error)
- func (mm *MemoryManager) MaxResidentSetSize() uint64
- func (mm *MemoryManager) NeedsUpdate(generation int64) bool
- func (mm *MemoryManager) NewAIOContext(ctx context.Context, events uint32) (uint64, error)
- func (mm *MemoryManager) ReadSeqFileData(ctx context.Context, handle seqfile.SeqHandle) ([]seqfile.SeqData, int64)
- func (mm *MemoryManager) ResidentSetSize() uint64
- func (mm *MemoryManager) SetArgvEnd(a usermem.Addr)
- func (mm *MemoryManager) SetArgvStart(a usermem.Addr)
- func (mm *MemoryManager) SetAuxv(auxv arch.Auxv)
- func (mm *MemoryManager) SetEnvvEnd(a usermem.Addr)
- func (mm *MemoryManager) SetEnvvStart(a usermem.Addr)
- func (mm *MemoryManager) SetExecutable(d *fs.Dirent)
- func (mm *MemoryManager) SetMmapLayout(ac arch.Context, r *limits.LimitSet) (arch.MmapLayout, error)
- func (mm *MemoryManager) String() string
- func (mm *MemoryManager) SwapUint32(ctx context.Context, addr usermem.Addr, new uint32, opts usermem.IOOpts) (uint32, error)
- func (mm *MemoryManager) Sync(ctx context.Context, addr usermem.Addr, length uint64) error
- func (mm *MemoryManager) VirtualMemorySize() uint64
- func (mm *MemoryManager) VirtualMemorySizeRange(ar usermem.AddrRange) uint64
- func (mm *MemoryManager) ZeroOut(ctx context.Context, addr usermem.Addr, toZero int64, opts usermem.IOOpts) (int64, error)
- type SpecialMappable
- func (m *SpecialMappable) AddMapping(ctx context.Context, ms memmap.MappingSpace, ar usermem.AddrRange, ...) error
- func (m *SpecialMappable) CopyMapping(ctx context.Context, ms memmap.MappingSpace, srcAR, dstAR usermem.AddrRange, ...) error
- func (m *SpecialMappable) DecRef()
- func (m *SpecialMappable) DeviceID() uint64
- func (m *SpecialMappable) FileRange() platform.FileRange
- func (m *SpecialMappable) InodeID() uint64
- func (m *SpecialMappable) InvalidateUnsavable(ctx context.Context) error
- func (m *SpecialMappable) Length() uint64
- func (m *SpecialMappable) MappedName(ctx context.Context) string
- func (m *SpecialMappable) Msync(ctx context.Context, mr memmap.MappableRange) error
- func (m *SpecialMappable) Platform() platform.Platform
- func (m *SpecialMappable) RemoveMapping(ctx context.Context, ms memmap.MappingSpace, ar usermem.AddrRange, ...)
- func (m *SpecialMappable) Translate(ctx context.Context, required, optional memmap.MappableRange, ...) ([]memmap.Translation, error)
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type AIOContext ¶
type AIOContext struct {
// contains filtered or unexported fields
}
AIOContext is a single asynchronous I/O context.
func (*AIOContext) FinishRequest ¶
func (ctx *AIOContext) FinishRequest(data interface{})
FinishRequest finishes a pending request. It queues up the data and notifies listeners.
func (*AIOContext) PopRequest ¶
func (ctx *AIOContext) PopRequest() (interface{}, bool)
PopRequest pops a completed request if available, this function does not do any blocking. Returns false if no request is available.
func (*AIOContext) Prepare ¶
func (ctx *AIOContext) Prepare() bool
Prepare reserves space for a new request, returning true if available. Returns false if the context is busy.
func (*AIOContext) WaitChannel ¶
func (ctx *AIOContext) WaitChannel() (chan struct{}, bool)
WaitChannel returns a channel that is notified when an AIO request is completed.
The boolean return value indicates whether or not the context is active.
type MRemapMoveMode ¶
type MRemapMoveMode int
MRemapMoveMode controls MRemap's moving behavior.
const ( // MRemapNoMove prevents MRemap from moving the remapped mapping. MRemapNoMove MRemapMoveMode = iota // MRemapMayMove allows MRemap to move the remapped mapping. MRemapMayMove // MRemapMustMove requires MRemap to move the remapped mapping to // MRemapOpts.NewAddr, replacing any existing mappings in the remapped // range. MRemapMustMove )
type MRemapOpts ¶
type MRemapOpts struct { // Move controls whether MRemap moves the remapped mapping to a new address. Move MRemapMoveMode // NewAddr is the new address for the remapping. NewAddr is ignored unless // Move is MMRemapMustMove. NewAddr usermem.Addr }
MRemapOpts specifies options to MRemap.
type MemoryManager ¶
type MemoryManager struct {
// contains filtered or unexported fields
}
MemoryManager implements a virtual address space.
func NewMemoryManager ¶
func NewMemoryManager(p platform.Platform) *MemoryManager
NewMemoryManager returns a new MemoryManager with no mappings and 1 user.
func (*MemoryManager) Activate ¶
func (mm *MemoryManager) Activate() error
Activate ensures this MemoryManager has a platform.AddressSpace.
The caller must not hold any locks when calling Activate.
When this MemoryManager is no longer needed by a task, it should call Deactivate to release the reference.
func (*MemoryManager) AddressSpace ¶
func (mm *MemoryManager) AddressSpace() platform.AddressSpace
AddressSpace returns the platform.AddressSpace bound to mm.
Preconditions: The caller must have called mm.Activate().
func (*MemoryManager) ArgvEnd ¶
func (mm *MemoryManager) ArgvEnd() usermem.Addr
ArgvEnd returns the end of the application argument vector.
There is no guarantee that this value is sensible w.r.t. ArgvStart.
func (*MemoryManager) ArgvStart ¶
func (mm *MemoryManager) ArgvStart() usermem.Addr
ArgvStart returns the start of the application argument vector.
There is no guarantee that this value is sensible w.r.t. ArgvEnd.
func (*MemoryManager) Auxv ¶
func (mm *MemoryManager) Auxv() arch.Auxv
Auxv returns the current map of auxiliary vectors.
func (*MemoryManager) Brk ¶
Brk implements the semantics of Linux's brk(2), except that it returns an error on failure.
func (*MemoryManager) BrkSetup ¶
func (mm *MemoryManager) BrkSetup(ctx context.Context, addr usermem.Addr)
BrkSetup sets mm's brk address to addr and its brk size to 0.
func (*MemoryManager) CompareAndSwapUint32 ¶
func (mm *MemoryManager) CompareAndSwapUint32(ctx context.Context, addr usermem.Addr, old, new uint32, opts usermem.IOOpts) (uint32, error)
CompareAndSwapUint32 implements usermem.IO.CompareAndSwapUint32.
func (*MemoryManager) CopyIn ¶
func (mm *MemoryManager) CopyIn(ctx context.Context, addr usermem.Addr, dst []byte, opts usermem.IOOpts) (int, error)
CopyIn implements usermem.IO.CopyIn.
func (*MemoryManager) CopyInTo ¶
func (mm *MemoryManager) CopyInTo(ctx context.Context, ars usermem.AddrRangeSeq, dst safemem.Writer, opts usermem.IOOpts) (int64, error)
CopyInTo implements usermem.IO.CopyInTo.
func (*MemoryManager) CopyOut ¶
func (mm *MemoryManager) CopyOut(ctx context.Context, addr usermem.Addr, src []byte, opts usermem.IOOpts) (int, error)
CopyOut implements usermem.IO.CopyOut.
func (*MemoryManager) CopyOutFrom ¶
func (mm *MemoryManager) CopyOutFrom(ctx context.Context, ars usermem.AddrRangeSeq, src safemem.Reader, opts usermem.IOOpts) (int64, error)
CopyOutFrom implements usermem.IO.CopyOutFrom.
func (*MemoryManager) Deactivate ¶
func (mm *MemoryManager) Deactivate() error
Deactivate releases a release to the MemoryManager.
func (*MemoryManager) DebugString ¶
func (mm *MemoryManager) DebugString(ctx context.Context) string
DebugString returns a string containing information about mm for debugging.
func (*MemoryManager) DecUsers ¶
func (mm *MemoryManager) DecUsers(ctx context.Context)
DecUsers decrements mm's user count. If the user count reaches 0, all mappings in mm are unmapped.
func (*MemoryManager) Decommit ¶
func (mm *MemoryManager) Decommit(addr usermem.Addr, length uint64) error
Decommit implements the semantics of Linux's madvise(MADV_DONTNEED).
func (*MemoryManager) DestroyAIOContext ¶
func (mm *MemoryManager) DestroyAIOContext(ctx context.Context, id uint64) bool
DestroyAIOContext destroys an asynchronous I/O context. It returns false if the context does not exist.
func (*MemoryManager) EnvvEnd ¶
func (mm *MemoryManager) EnvvEnd() usermem.Addr
EnvvEnd returns the end of the application environment vector.
There is no guarantee that this value is sensible w.r.t. EnvvStart.
func (*MemoryManager) EnvvStart ¶
func (mm *MemoryManager) EnvvStart() usermem.Addr
EnvvStart returns the start of the application environment vector.
There is no guarantee that this value is sensible w.r.t. EnvvEnd.
func (*MemoryManager) Executable ¶
func (mm *MemoryManager) Executable() *fs.Dirent
Executable returns the executable, if available.
An additional reference will be taken in the case of a non-nil executable, which must be released by the caller.
func (*MemoryManager) Fork ¶
func (mm *MemoryManager) Fork(ctx context.Context) (*MemoryManager, error)
Fork creates a copy of mm with 1 user, as for Linux syscalls fork() or clone() (without CLONE_VM).
func (*MemoryManager) HandleUserFault ¶
func (mm *MemoryManager) HandleUserFault(ctx context.Context, addr usermem.Addr, at usermem.AccessType, sp usermem.Addr) error
HandleUserFault handles an application page fault. sp is the faulting application thread's stack pointer.
Preconditions: mm.as != nil.
func (*MemoryManager) IncUsers ¶
func (mm *MemoryManager) IncUsers() bool
IncUsers increments mm's user count and returns true. If the user count is already 0, IncUsers does nothing and returns false.
func (*MemoryManager) Invalidate ¶
func (mm *MemoryManager) Invalidate(ar usermem.AddrRange, opts memmap.InvalidateOpts)
Invalidate implements memmap.MappingSpace.Invalidate.
func (*MemoryManager) InvalidateUnsavable ¶
func (mm *MemoryManager) InvalidateUnsavable(ctx context.Context) error
InvalidateUnsavable invokes memmap.Mappable.InvalidateUnsavable on all Mappables mapped by mm.
func (*MemoryManager) LookupAIOContext ¶
func (mm *MemoryManager) LookupAIOContext(ctx context.Context, id uint64) (*AIOContext, bool)
LookupAIOContext looks up the given context. It returns false if the context does not exist.
func (*MemoryManager) MProtect ¶
func (mm *MemoryManager) MProtect(addr usermem.Addr, length uint64, realPerms usermem.AccessType, growsDown bool) error
MProtect implements the semantics of Linux's mprotect(2).
func (*MemoryManager) MRemap ¶
func (mm *MemoryManager) MRemap(ctx context.Context, oldAddr usermem.Addr, oldSize uint64, newSize uint64, opts MRemapOpts) (usermem.Addr, error)
MRemap implements the semantics of Linux's mremap(2).
func (*MemoryManager) MaxResidentSetSize ¶
func (mm *MemoryManager) MaxResidentSetSize() uint64
MaxResidentSetSize returns the value advertised as mm's max RSS in bytes.
func (*MemoryManager) NeedsUpdate ¶
func (mm *MemoryManager) NeedsUpdate(generation int64) bool
NeedsUpdate implements seqfile.SeqSource.NeedsUpdate.
func (*MemoryManager) NewAIOContext ¶
NewAIOContext creates a new context for asynchronous I/O.
NewAIOContext is analogous to Linux's fs/aio.c:ioctx_alloc().
func (*MemoryManager) ReadSeqFileData ¶
func (mm *MemoryManager) ReadSeqFileData(ctx context.Context, handle seqfile.SeqHandle) ([]seqfile.SeqData, int64)
ReadSeqFileData is called by fs/proc.mapsData.ReadSeqFileData.
func (*MemoryManager) ResidentSetSize ¶
func (mm *MemoryManager) ResidentSetSize() uint64
ResidentSetSize returns the value advertised as mm's RSS in bytes.
func (*MemoryManager) SetArgvEnd ¶
func (mm *MemoryManager) SetArgvEnd(a usermem.Addr)
SetArgvEnd sets the end of the application argument vector.
func (*MemoryManager) SetArgvStart ¶
func (mm *MemoryManager) SetArgvStart(a usermem.Addr)
SetArgvStart sets the start of the application argument vector.
func (*MemoryManager) SetAuxv ¶
func (mm *MemoryManager) SetAuxv(auxv arch.Auxv)
SetAuxv sets the entire map of auxiliary vectors.
func (*MemoryManager) SetEnvvEnd ¶
func (mm *MemoryManager) SetEnvvEnd(a usermem.Addr)
SetEnvvEnd sets the end of the application environment vector.
func (*MemoryManager) SetEnvvStart ¶
func (mm *MemoryManager) SetEnvvStart(a usermem.Addr)
SetEnvvStart sets the start of the application environment vector.
func (*MemoryManager) SetExecutable ¶
func (mm *MemoryManager) SetExecutable(d *fs.Dirent)
SetExecutable sets the executable.
This takes a reference on d.
func (*MemoryManager) SetMmapLayout ¶
func (mm *MemoryManager) SetMmapLayout(ac arch.Context, r *limits.LimitSet) (arch.MmapLayout, error)
SetMmapLayout initializes mm's layout from the given arch.Context.
Preconditions: mm contains no mappings and is not used concurrently.
func (*MemoryManager) String ¶
func (mm *MemoryManager) String() string
String implements fmt.Stringer.String.
func (*MemoryManager) SwapUint32 ¶
func (mm *MemoryManager) SwapUint32(ctx context.Context, addr usermem.Addr, new uint32, opts usermem.IOOpts) (uint32, error)
SwapUint32 implements usermem.IO.SwapUint32.
func (*MemoryManager) VirtualMemorySize ¶
func (mm *MemoryManager) VirtualMemorySize() uint64
VirtualMemorySize returns the combined length in bytes of all mappings in mm.
func (*MemoryManager) VirtualMemorySizeRange ¶
func (mm *MemoryManager) VirtualMemorySizeRange(ar usermem.AddrRange) uint64
VirtualMemorySizeRange returns the combined length in bytes of all mappings in ar in mm.
type SpecialMappable ¶
type SpecialMappable struct { refs.AtomicRefCount // contains filtered or unexported fields }
SpecialMappable implements memmap.MappingIdentity and memmap.Mappable with semantics similar to Linux's mm/mmap.c:_install_special_mapping(), except that SpecialMappable takes ownership of the memory that it represents (_install_special_mapping() does not.)
func NewSharedAnonMappable ¶
func NewSharedAnonMappable(length uint64, p platform.Platform) (*SpecialMappable, error)
NewSharedAnonMappable returns a SpecialMappable that implements the semantics of mmap(MAP_SHARED|MAP_ANONYMOUS) and mappings of /dev/zero.
TODO: The use of SpecialMappable is a lazy code reuse hack. Linux uses an ephemeral file created by mm/shmem.c:shmem_zero_setup(); we should do the same to get non-zero device and inode IDs.
func NewSpecialMappable ¶
NewSpecialMappable returns a SpecialMappable that owns fr, which represents offsets in p.Memory() that contain the SpecialMappable's data. The SpecialMappable will use the given name in /proc/[pid]/maps.
Preconditions: fr.Length() != 0.
func (*SpecialMappable) AddMapping ¶
func (m *SpecialMappable) AddMapping(ctx context.Context, ms memmap.MappingSpace, ar usermem.AddrRange, offset uint64) error
AddMapping implements memmap.Mappable.AddMapping.
func (*SpecialMappable) CopyMapping ¶
func (m *SpecialMappable) CopyMapping(ctx context.Context, ms memmap.MappingSpace, srcAR, dstAR usermem.AddrRange, offset uint64) error
CopyMapping implements memmap.Mappable.CopyMapping.
func (*SpecialMappable) DecRef ¶
func (m *SpecialMappable) DecRef()
DecRef implements refs.RefCounter.DecRef.
func (*SpecialMappable) DeviceID ¶
func (m *SpecialMappable) DeviceID() uint64
DeviceID implements memmap.MappingIdentity.DeviceID.
func (*SpecialMappable) FileRange ¶
func (m *SpecialMappable) FileRange() platform.FileRange
FileRange returns the offsets into Platform().Memory() that store the SpecialMappable's contents.
func (*SpecialMappable) InodeID ¶
func (m *SpecialMappable) InodeID() uint64
InodeID implements memmap.MappingIdentity.InodeID.
func (*SpecialMappable) InvalidateUnsavable ¶
func (m *SpecialMappable) InvalidateUnsavable(ctx context.Context) error
InvalidateUnsavable implements memmap.Mappable.InvalidateUnsavable.
func (*SpecialMappable) Length ¶
func (m *SpecialMappable) Length() uint64
Length returns the length of the SpecialMappable.
func (*SpecialMappable) MappedName ¶
func (m *SpecialMappable) MappedName(ctx context.Context) string
MappedName implements memmap.MappingIdentity.MappedName.
func (*SpecialMappable) Msync ¶
func (m *SpecialMappable) Msync(ctx context.Context, mr memmap.MappableRange) error
Msync implements memmap.MappingIdentity.Msync.
func (*SpecialMappable) Platform ¶
func (m *SpecialMappable) Platform() platform.Platform
Platform returns the Platform whose Memory stores the SpecialMappable's contents.
func (*SpecialMappable) RemoveMapping ¶
func (m *SpecialMappable) RemoveMapping(ctx context.Context, ms memmap.MappingSpace, ar usermem.AddrRange, offset uint64)
RemoveMapping implements memmap.Mappable.RemoveMapping.
func (*SpecialMappable) Translate ¶
func (m *SpecialMappable) Translate(ctx context.Context, required, optional memmap.MappableRange, at usermem.AccessType) ([]memmap.Translation, error)
Translate implements memmap.Mappable.Translate.