Пример #1
0
        private static unsafe void FreeAddrGlobal(Addr addr)
        {
            var physAddr = PageTable.KernelTable.GetPhysicalAddressFromVirtual(addr);

            if (AddProtectedRegions)
            {
                addr -= 4096;
            }
            GlobalAllocator.FreeAddr(addr);
            PhysicalPageManager.FreeAddr(physAddr);

            PageTable.KernelTable.UnMap(addr);
        }
Пример #2
0
        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");
            }
        }