internal static bool QueryMemory(UIntPtr queryAddr, out UIntPtr regionAddr, out UIntPtr regionSize) { #if SINGULARITY_KERNEL PageType type = Sing_MemoryManager.KernelQuery( queryAddr, out regionAddr, out regionSize); return(type != PageType.Unknown); #elif SINGULARITY_PROCESS return(PageTableService.Query(queryAddr, out regionAddr, out regionSize)); #endif }
internal static void FreeMemory(UIntPtr startAddr, UIntPtr size) { #if SINGULARITY_KERNEL DebugStub.Assert(Sing_MemoryManager.IsPageAligned(size)); Sing_MemoryManager.KernelFree( startAddr, Sing_MemoryManager.PagesFromBytes(size), Process.kernelProcess); #elif SINGULARITY_PROCESS VTable.Assert((size & PageTable.PageMask) == 0); PageTableService.Free(startAddr, size); #endif }
//////////////////////////////////// Allocation and Free Routines. // // Allocation is optimized for the case where an allocation starts // with a relatively small amount of memory and grows over time. // This is exactly the behavior exhibited by stacks and GC heaps. // // The allocation strategy also works well for large initial // allocations. The strategy would be very inefficient if a very // large number of small, completely independent allocations are // made. // // AllocateMemory(size) performs an initial allocation. // AllocateMemory(startAddr, size) performs growing allocations. // internal static unsafe UIntPtr AllocateMemory(UIntPtr size) { VTable.Assert(PageTable.PageAligned(size)); #if SINGULARITY_KERNEL UIntPtr addr = Sing_MemoryManager.KernelAllocate( Sing_MemoryManager.PagesFromBytes(size), Process.kernelProcess, 0, PageType.Unknown); #elif SINGULARITY_PROCESS UIntPtr addr = PageTableService.Allocate(size); #endif #if SINGULARITY_KERNEL Kernel.Waypoint((int)size); Kernel.Waypoint(811); #endif // SINGULARITY_KERNEL if (addr != UIntPtr.Zero) { Util.MemClear(addr, size); } return(addr); }
internal static unsafe bool AllocateMemory(UIntPtr startAddr, UIntPtr size) { VTable.Deny(inAllocator); inAllocator = true; VTable.Assert(PageTable.PageAligned(startAddr)); VTable.Assert(PageTable.PageAligned(size)); #if SINGULARITY_KERNEL UIntPtr addr = Sing_MemoryManager.KernelExtend( startAddr, Sing_MemoryManager.PagesFromBytes(size), Process.kernelProcess, PageType.Unknown); #elif SINGULARITY_PROCESS UIntPtr addr = PageTableService.AllocateExtend(startAddr, size); #endif inAllocator = false; if (addr != UIntPtr.Zero) { Util.MemClear(addr, size); return(true); } return(false); }