コード例 #1
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));
        }
コード例 #2
0
ファイル: VirtualPageManager.cs プロジェクト: arakis/abanu
        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));
            //}
        }
コード例 #3
0
ファイル: VirtualPageManager.cs プロジェクト: djlw78/abanu
        /// <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));
        }
コード例 #4
0
ファイル: PhysicalPageManager.cs プロジェクト: djlw78/abanu
 public static Page *AllocatePages(uint pages, AllocatePageOptions options = default)
 {
     return(Default.AllocatePages(pages, options));
 }
コード例 #5
0
 public static Addr AllocatePagesAddr(this IPageFrameAllocator allocator, uint pages, AllocatePageOptions options = default)
 {
     return(allocator.GetAddress(allocator.AllocatePages(pages, options)));
 }