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(uint pages, AllocatePageOptions options = default) { return(Default.AllocatePagesAddr(pages, options)); }