コード例 #1
0
ファイル: VirtualPageManager.cs プロジェクト: arakis/abanu
        //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);
        }
コード例 #2
0
ファイル: VirtualPageManager.cs プロジェクト: djlw78/abanu
        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);
        }
コード例 #3
0
        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));
        }
コード例 #4
0
 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();
         }
     }
 }
コード例 #5
0
ファイル: PhysicalPageManager.cs プロジェクト: arakis/abanu
        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();
        }
コード例 #6
0
        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');
        }
コード例 #7
0
        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;
            }
        }
コード例 #8
0
ファイル: VirtualPageManager.cs プロジェクト: djlw78/abanu
        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");
            }
        }
コード例 #9
0
 public static Addr AllocatePageAddr(this IPageFrameAllocator allocator, AllocatePageOptions options = default)
 {
     return(allocator.GetAddress(allocator.AllocatePage(options)));
 }
コード例 #10
0
 public static void FreeAddr(this IPageFrameAllocator allocator, Addr addr)
 {
     allocator.Free(allocator.GetPageByAddress(addr));
 }
コード例 #11
0
 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);
 }