Exemplo n.º 1
0
        /// <summary>
        /// Creates a new instance of the host mapped memory manager.
        /// </summary>
        /// <param name="backingMemory">Physical backing memory where virtual memory will be mapped to</param>
        /// <param name="addressSpaceSize">Size of the address space</param>
        /// <param name="unsafeMode">True if unmanaged access should not be masked (unsafe), false otherwise.</param>
        /// <param name="invalidAccessHandler">Optional function to handle invalid memory accesses</param>
        public MemoryManagerHostMapped(MemoryBlock backingMemory, ulong addressSpaceSize, bool unsafeMode, InvalidAccessHandler invalidAccessHandler = null)
        {
            _backingMemory        = backingMemory;
            _pageTable            = new PageTable <ulong>();
            _invalidAccessHandler = invalidAccessHandler;
            _unsafeMode           = unsafeMode;
            _addressSpaceSize     = addressSpaceSize;

            ulong asSize = PageSize;
            int   asBits = PageBits;

            while (asSize < addressSpaceSize)
            {
                asSize <<= 1;
                asBits++;
            }

            AddressSpaceBits = asBits;

            _pageBitmap = new ulong[1 << (AddressSpaceBits - (PageBits + PageToPteShift))];

            MemoryAllocationFlags asFlags = MemoryAllocationFlags.Reserve | MemoryAllocationFlags.ViewCompatible;

            _addressSpace       = new MemoryBlock(asSize, asFlags);
            _addressSpaceMirror = new MemoryBlock(asSize, asFlags | MemoryAllocationFlags.ForceWindows4KBViewMapping);

            Tracking  = new MemoryTracking(this, PageSize, invalidAccessHandler);
            _memoryEh = new MemoryEhMeilleure(_addressSpace, Tracking);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Create a new tracking structure for the given "physical" memory block,
        /// with a given "virtual" memory manager that will provide mappings and virtual memory protection.
        /// </summary>
        /// <param name="memoryManager">Virtual memory manager</param>
        /// <param name="block">Physical memory block</param>
        /// <param name="pageSize">Page size of the virtual memory space</param>
        public MemoryTracking(IVirtualMemoryManager memoryManager, int pageSize, InvalidAccessHandler invalidAccessHandler = null)
        {
            _memoryManager        = memoryManager;
            _pageSize             = pageSize;
            _invalidAccessHandler = invalidAccessHandler;

            _virtualRegions = new NonOverlappingRangeList <VirtualRegion>();
        }
Exemplo n.º 3
0
        public IProcessContext Create(KernelContext context, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler)
        {
            MemoryManagerMode mode = context.Device.Configuration.MemoryManagerMode;

            switch (mode)
            {
            case MemoryManagerMode.SoftwarePageTable:
                return(new ArmProcessContext <MemoryManager>(new MemoryManager(addressSpaceSize, invalidAccessHandler)));

            case MemoryManagerMode.HostMapped:
            case MemoryManagerMode.HostMappedUnsafe:
                ARMeilleure.Optimizations.UnsafeHostMappedMemory = mode == MemoryManagerMode.HostMappedUnsafe;
                return(new ArmProcessContext <MemoryManagerHostMapped>(new MemoryManagerHostMapped(addressSpaceSize, invalidAccessHandler)));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Creates a new instance of the memory manager.
        /// </summary>
        /// <param name="backingMemory">Physical backing memory where virtual memory will be mapped to</param>
        /// <param name="addressSpaceSize">Size of the address space</param>
        /// <param name="invalidAccessHandler">Optional function to handle invalid memory accesses</param>
        public MemoryManager(MemoryBlock backingMemory, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler = null)
        {
            _invalidAccessHandler = invalidAccessHandler;

            ulong asSize = PageSize;
            int   asBits = PageBits;

            while (asSize < addressSpaceSize)
            {
                asSize <<= 1;
                asBits++;
            }

            AddressSpaceBits  = asBits;
            _addressSpaceSize = asSize;
            _backingMemory    = backingMemory;
            _pageTable        = new MemoryBlock((asSize / PageSize) * PteSize);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Creates a new instance of the memory manager.
        /// </summary>
        /// <param name="addressSpaceSize">Size of the address space</param>
        /// <param name="invalidAccessHandler">Optional function to handle invalid memory accesses</param>
        public MemoryManager(ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler = null)
        {
            _invalidAccessHandler = invalidAccessHandler;

            ulong asSize = PageSize;
            int   asBits = PageBits;

            while (asSize < addressSpaceSize)
            {
                asSize <<= 1;
                asBits++;
            }

            AddressSpaceBits  = asBits;
            _addressSpaceSize = asSize;
            _pageTable        = new MemoryBlock((asSize / PageSize) * PteSize);

            Tracking = new MemoryTracking(this, PageSize);
            Tracking.EnablePhysicalProtection = false; // Disabled for now, as protection is done in software.
        }
Exemplo n.º 6
0
        /// <summary>
        /// Creates a new instance of the host mapped memory manager.
        /// </summary>
        /// <param name="addressSpaceSize">Size of the address space</param>
        /// <param name="invalidAccessHandler">Optional function to handle invalid memory accesses</param>
        public MemoryManagerHostMapped(ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler = null)
        {
            _invalidAccessHandler = invalidAccessHandler;
            _addressSpaceSize     = addressSpaceSize;

            ulong asSize = PageSize;
            int   asBits = PageBits;

            while (asSize < addressSpaceSize)
            {
                asSize <<= 1;
                asBits++;
            }

            AddressSpaceBits = asBits;

            _pageTable          = new ulong[1 << (AddressSpaceBits - (PageBits + PageToPteShift))];
            _addressSpace       = new MemoryBlock(asSize, MemoryAllocationFlags.Reserve | MemoryAllocationFlags.Mirrorable);
            _addressSpaceMirror = _addressSpace.CreateMirror();
            Tracking            = new MemoryTracking(this, PageSize, invalidAccessHandler);
            _memoryEh           = new MemoryEhMeilleure(_addressSpace, Tracking);
        }
Exemplo n.º 7
0
        public IProcessContext Create(KernelContext context, long pid, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler, bool for64Bit)
        {
            MemoryManagerMode mode = context.Device.Configuration.MemoryManagerMode;

            switch (mode)
            {
            case MemoryManagerMode.SoftwarePageTable:
                return(new ArmProcessContext <MemoryManager>(pid, _gpu, new MemoryManager(addressSpaceSize, invalidAccessHandler), for64Bit));

            case MemoryManagerMode.HostMapped:
            case MemoryManagerMode.HostMappedUnsafe:
                bool unsafeMode = mode == MemoryManagerMode.HostMappedUnsafe;
                return(new ArmProcessContext <MemoryManagerHostMapped>(pid, _gpu, new MemoryManagerHostMapped(addressSpaceSize, unsafeMode, invalidAccessHandler), for64Bit));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Exemplo n.º 8
0
 public IProcessContext Create(MemoryBlock backingMemory, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler)
 {
     return(new ProcessContext(new AddressSpaceManager(backingMemory, addressSpaceSize)));
 }
Exemplo n.º 9
0
 public IProcessContext Create(KernelContext context, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler)
 {
     return(new ProcessContext(new AddressSpaceManager(addressSpaceSize)));
 }
Exemplo n.º 10
0
        public IProcessContext Create(KernelContext context, ulong pid, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler, bool for64Bit)
        {
            MemoryManagerMode mode = context.Device.Configuration.MemoryManagerMode;

            if (!MemoryBlock.SupportsFlags(MemoryAllocationFlags.ViewCompatible))
            {
                mode = MemoryManagerMode.SoftwarePageTable;
            }

            switch (mode)
            {
            case MemoryManagerMode.SoftwarePageTable:
                var memoryManager = new MemoryManager(context.Memory, addressSpaceSize, invalidAccessHandler);
                return(new ArmProcessContext <MemoryManager>(pid, _cpuEngine, _gpu, memoryManager, for64Bit));

            case MemoryManagerMode.HostMapped:
            case MemoryManagerMode.HostMappedUnsafe:
                bool unsafeMode = mode == MemoryManagerMode.HostMappedUnsafe;
                var  memoryManagerHostMapped = new MemoryManagerHostMapped(context.Memory, addressSpaceSize, unsafeMode, invalidAccessHandler);
                return(new ArmProcessContext <MemoryManagerHostMapped>(pid, _cpuEngine, _gpu, memoryManagerHostMapped, for64Bit));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Exemplo n.º 11
0
 public IProcessContext Create(KernelContext context, ulong pid, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler, bool for64Bit)
 {
     return(new ProcessContext(new AddressSpaceManager(context.Memory, addressSpaceSize)));
 }