//private static Addr _startVirtAddr; //private static Addr _nextVirtAddr; //private static Addr _identityStartVirtAddr; //private static Addr _identityNextVirtAddr; public static void Setup() { //_startVirtAddr = Address.VirtMapStart; //_nextVirtAddr = _startVirtAddr; //lockObj = new object(); //LockCount = 0; NormalAllocator = CreateAllocatorStage1(); NormalAllocator = CreateAllocatorStage2(); //_identityStartVirtAddr = Address.IdentityMapStart; //_identityNextVirtAddr = _identityStartVirtAddr; var allocator2 = new VirtualInitialPageAllocator(false) { DebugName = "VirtIdentityInitial" }; allocator2.Setup(new MemoryRegion(Address.IdentityMapStart, 60 * 1024 * 1024), AddressSpaceKind.Virtual); IdentityAllocator = allocator2; var allocator3 = new VirtualInitialPageAllocator(false) { DebugName = "GlobalInitial" }; allocator3.Setup(new MemoryRegion(600 * 1024 * 1024, 100 * 1024 * 1024), AddressSpaceKind.Virtual); GlobalAllocator = allocator3; PhysicalPageManager.SelfTest(); SelfTest(NormalAllocator); SelfTest(IdentityAllocator); }
public static void Setup() { NormalAllocator = CreateAllocatorStage1(); NormalAllocator = CreateAllocatorStage2(); var allocator2 = new VirtualInitialPageAllocator(false) { DebugName = "VirtIdentityInitial" }; allocator2.Setup(new MemoryRegion(Address.IdentityMapStart, 60 * 1024 * 1024), AddressSpaceKind.Virtual); IdentityAllocator = allocator2; var allocator3 = new VirtualInitialPageAllocator(false) { DebugName = "GlobalInitial" }; allocator3.Setup(new MemoryRegion(600 * 1024 * 1024, 100 * 1024 * 1024), AddressSpaceKind.Virtual); GlobalAllocator = allocator3; PhysicalPageManager.SelfTest(); SelfTest(NormalAllocator); SelfTest(IdentityAllocator); }
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)); }
public static void DumpStats(this IPageFrameAllocator allocator) { KernelMessage.WriteLine("Stats for {0}", allocator.DebugName); KernelMessage.WriteLine("TotalPages {0}, FreePages {1}, Requests {2}, Releases {3}, Allocations {4}", allocator.TotalPages, allocator.FreePages, (uint)allocator.Requests, (uint)allocator.Releases, (uint)(allocator.Requests - allocator.Releases)); if (allocator is MultiAllocator) { var multi = (MultiAllocator)allocator; for (var i = 0; i < multi.Allocators.Length; i++) { multi.Allocators[i].DumpStats(); } } }
public static void Setup() { var allocator = new PhysicalInitialPageAllocator() { DebugName = "PhysInitial" }; //allocator.Setup(new MemoryRegion(2 * 1024 * 1024, BootInfo.Header->InstalledPhysicalMemory - (2 * 1024 * 1024)), AddressSpaceKind.Physical); allocator.Setup(new MemoryRegion(0, BootInfo.Header->InstalledPhysicalMemory).TrimEndLocation(Address.IdentityMapStart), AddressSpaceKind.Physical); Default = allocator; ClearKernelReserved(); //UnmapUnsedPages(); SelfTest(); }
public static void DumpPages(this IPageFrameAllocator allocator) { var sb = new StringBuffer(); sb.Append("Allocator Dump of {0}. TotalPages={1} Free={2}", allocator.DebugName, allocator.TotalPages, allocator.FreePages); for (uint i = 0; i < allocator.TotalPages; i++) { var p = allocator.GetPageByIndex(i); if (i % 64 == 0) { sb.Append("\nIndex={0} Page {1} at {2:X8}, PageStructAddr={3:X8}: ", i, allocator.GetPageNum(p), allocator.GetAddress(p), (uint)p); sb.WriteTo(DeviceManager.Serial1); sb.Clear(); } sb.Append((int)p->Status); sb.WriteTo(DeviceManager.Serial1); sb.Clear(); } DeviceManager.Serial1.Write('\n'); }
public static unsafe void Map(this IPageTable table, Addr virtAddr, Addr physAddr, IPageFrameAllocator physAllocator, bool present = true, bool flush = false) { var page = physAllocator.GetPageByAddress(physAddr); var pAddr = physAllocator.GetAddress(page); while (true) { table.Map(virtAddr, pAddr, present, flush); page = physAllocator.NextCompoundPage(page); pAddr = physAllocator.GetAddress(page); if (page == null || pAddr == physAddr) { break; } virtAddr += 4096; } }
private static unsafe void SelfTest(IPageFrameAllocator allocator) { if (SelfTestDump) { allocator.DumpPages(); } KernelMessage.WriteLine("Begin SelfTest {0}", allocator.DebugName); var ptrPages = (allocator.TotalPages * 4) / 4096; var ptrListAddr = AllocatePages(ptrPages); // pointers for 4GB of pages var ptrList = (Addr *)ptrListAddr; var checkPageCount = allocator.FreePages; checkPageCount -= allocator.CriticalLowPages; uint checkPagesEach = 4; checkPageCount /= checkPagesEach; //checkPageCount = 32; var mapPhysAddr = PhysicalPageManager.AllocatePageAddr(checkPagesEach); for (var i = 0; i < checkPageCount; i++) { if (SelfTestDump) { KernelMessage.Write("."); } var testAddr = allocator.AllocatePagesAddr(checkPagesEach); ptrList[i] = testAddr; //KernelMessage.WriteLine("{0:X8}-->{1:X8}", testAddr, mapPhysAddr); PageTable.KernelTable.Map(testAddr, mapPhysAddr, 4096 * checkPagesEach, true, true); var mapPtr = (uint *)testAddr; for (var pos = 0; pos < 1024 * checkPagesEach; pos++) { *mapPtr = 0xEBFEEBFE; mapPtr += 1; } PageTable.KernelTable.UnMap(testAddr, 4096 * checkPagesEach, true); //Default.Free(testPage); } PhysicalPageManager.FreeAddr(mapPhysAddr); if (SelfTestDump) { allocator.DumpPages(); } KernelMessage.WriteLine("Free Pages now"); for (var i = 0; i < checkPageCount; i++) { if (SelfTestDump) { KernelMessage.Write(":"); } var testAddr = ptrList[i]; //KernelMessage.WriteLine("Free: {0:X8}", testAddr); allocator.FreeAddr(testAddr); } KernelMessage.WriteLine("Free ptrList"); FreeAddr(ptrListAddr); KernelMessage.WriteLine("SelfTest Done"); if (SelfTestDump) { allocator.DumpPages(); KernelMessage.WriteLine("Final Dump"); } }
public static Addr AllocatePageAddr(this IPageFrameAllocator allocator, AllocatePageOptions options = default) { return(allocator.GetAddress(allocator.AllocatePage(options))); }
public static void FreeAddr(this IPageFrameAllocator allocator, Addr addr) { allocator.Free(allocator.GetPageByAddress(addr)); }
public static void DumpPage(this IPageFrameAllocator allocator, Page *p) { KernelMessage.WriteLine("pNum {0}, phys {1:X8} status {2} struct {3:X8} structPage {4}", allocator.GetPageNum(p), allocator.GetAddress(p), (uint)p->Status, (uint)p, (uint)p / 4096); }