public static MemoryRegion AllocateRegion(this IPageFrameAllocator allocator, USize size, AllocatePageOptions options = default) { var pages = KMath.DivCeil(size, 4096); var p = allocator.AllocatePages(pages, options); return(new MemoryRegion(allocator.GetAddress(p), pages * 4096)); }
private static unsafe Addr AllocateGlobalPages(uint pages, AllocatePageOptions options = default) { if (AddProtectedRegions) { pages += 2; } //lock (lockObj) //{ // LockCount++; var physHead = PhysicalPageManager.AllocatePages(pages, options); if (physHead == null) { return(Addr.Zero); } var virtHead = GlobalAllocator.AllocatePages(pages, options); var p = physHead; var v = virtHead; for (var i = 0; i < pages; i++) { var map = true; if (AddProtectedRegions && (i == 0 || i == pages - 1)) { map = false; } if (map) { PageTable.KernelTable.Map(GlobalAllocator.GetAddress(v), PhysicalPageManager.GetAddress(p)); } p = PhysicalPageManager.NextCompoundPage(p); v = GlobalAllocator.NextCompoundPage(v); } PageTable.KernelTable.Flush(); if (AddProtectedRegions) { virtHead = GlobalAllocator.NextCompoundPage(virtHead); } //LockCount--; return(GlobalAllocator.GetAddress(virtHead)); //} }
/// <summary> /// Returns pages, where virtAddr equals physAddr. /// </summary> private static unsafe Addr AllocateIdentityMappedPages(uint pages, AllocatePageOptions options = default) { if (AddProtectedRegions) { pages += 2; } var virtHead = IdentityAllocator.AllocatePages(pages, options); var v = virtHead; for (var i = 0; i < pages; i++) { var addr = IdentityAllocator.GetAddress(v); var map = true; if (AddProtectedRegions && (i == 0 || i == pages - 1)) { map = false; } if (map) { PageTable.KernelTable.Map(addr, addr); } v = IdentityAllocator.NextCompoundPage(v); } PageTable.KernelTable.Flush(); if (AddProtectedRegions) { virtHead = IdentityAllocator.NextCompoundPage(virtHead); } return(IdentityAllocator.GetAddress(virtHead)); }
public static Page *AllocatePages(uint pages, AllocatePageOptions options = default) { return(Default.AllocatePages(pages, options)); }
public static Addr AllocatePagesAddr(this IPageFrameAllocator allocator, uint pages, AllocatePageOptions options = default) { return(allocator.GetAddress(allocator.AllocatePages(pages, options))); }