Esempio n. 1
0
        public virtual void Setup(MemoryRegion region, AddressSpaceKind addressSpaceKind)
        {
            AddressSpaceKind = addressSpaceKind;
            region.Size      = KMath.FloorToPowerOfTwo(region.Size);
            _Region          = region;
            var totalPages = region.Size >> BuddyAllocatorImplementation.BUDDY_PAGE_SHIFT;

            KernelMessage.WriteLine("Init Allocator: StartAddr: {0}, {1} Pages", region.Start, totalPages);
            // init global memory block
            // all pages area
            var pages_size = totalPages * (uint)sizeof(Page);

            KernelMessage.WriteLine("Page Array Size in bytes: {0}", pages_size);
            Pages = (Page *)AllocRawMemory(pages_size).Start;
            KernelMessage.WriteLine("Page Array Addr: {0:X8}", (uint)Pages);
            var start_addr = region.Start;

            Zone.free_area = (BuddyAllocatorImplementation.free_area *)AllocRawMemory(BuddyAllocatorImplementation.BUDDY_MAX_ORDER * (uint)sizeof(BuddyAllocatorImplementation.free_area)).Start;

            fixed(BuddyAllocatorImplementation.mem_zone *zone = &Zone)
            ZonePtr = zone;

            BuddyAllocatorImplementation.buddy_system_init(
                ZonePtr,
                Pages,
                start_addr,
                totalPages);
        }
Esempio n. 2
0
 public KernelMemoryMap(Addr start, USize size, BootInfoMemoryType type, AddressSpaceKind addressSpaceKind)
 {
     Start            = start;
     Size             = size;
     Type             = type;
     AddressSpaceKind = addressSpaceKind;
 }
Esempio n. 3
0
        public void Setup(MemoryRegion region, AddressSpaceKind addrKind)
        {
            TraceOptions      = new PageFrameAllocatorTraceOptions();
            _AddressSpaceKind = addrKind;
            _Region           = region;
            FistPageNum       = region.Start / PageSize;
            _TotalPages       = region.Size / PageSize;
            kmap      = AllocRawMemory(_TotalPages * (uint)sizeof(Page));
            PageArray = (Page *)kmap.Start;

            var firstSelfPageNum = KMath.DivFloor(kmap.Start, 4096);
            var selfPages        = KMath.DivFloor(kmap.Size, 4096);

            KernelMessage.WriteLine("Page Frame Array allocated {0} pages, beginning with page {1} at {2:X8}", selfPages, firstSelfPageNum, (uint)PageArray);

            PageTable.KernelTable.SetWritable(kmap.Start, kmap.Size);
            kmap.Clear();

            var addr = FistPageNum * 4096;

            for (uint i = 0; i < _TotalPages; i++)
            {
                //KernelMessage.WriteLine(i);
                PageArray[i].Address = addr;
                //if (i != 0)
                //    PageArray[i - 1].Next = &PageArray[i];
                addr += 4096;
            }

            KernelMessage.WriteLine("Setup free memory");
            SetupFreeMemory();
            KernelMessage.WriteLine("Build linked lists");
            BuildLinkedLists();
            KernelMessage.WriteLine("Build linked lists done");

            _FreePages = 0;
            for (uint i = 0; i < _TotalPages; i++)
            {
                if (PageArray[i].Status == PageStatus.Free)
                {
                    _FreePages++;
                }
            }

            //Assert.True(list_head.list_count(FreeList) == _FreePages, "list_head.list_count(FreeList) == _FreePages");
            var debugCheckCount = list_head.list_count(FreeList);

            if (debugCheckCount != _FreePages)
            {
                KernelMessage.WriteLine("debugCheckCount {0} != {1}", debugCheckCount, _FreePages);
                Debug.Break();
            }

            KernelMessage.Path(DebugName, "Pages Free: {0}", FreePages);
        }
Esempio n. 4
0
        public static KernelMemoryMap Allocate(USize size, BootInfoMemoryType type, AddressSpaceKind addressSpaceKind)
        {
            var cnt = Header->Used.Count;

            for (uint i = 0; i < cnt; i++)
            {
                var map = Header->Used.Items[i];
                if (CheckPageIsUsableAfterMap(map, size, addressSpaceKind))
                {
                    var newMap = new KernelMemoryMap(map.Start + map.Size, size, type, addressSpaceKind);
                    Header->Used.Add(newMap);
                    KernelMessage.Path("KernelMemoryMapManager", "Allocated: at {0:X8}, size {1:X8}, type {2}", newMap.Start, size, (uint)type);
                    return(newMap);
                }
            }
            return(KernelMemoryMap.Empty);
        }
Esempio n. 5
0
        public void Setup(MemoryRegion region, AddressSpaceKind addrKind)
        {
            _Requests = 0;
            _Releases = 0;

            _AddressSpaceKind = addrKind;
            _Region           = region;
            FistPageNum       = region.Start / PageSize;
            _TotalPages       = region.Size / PageSize;
            kmap        = AllocRawMemory(_TotalPages * (uint)sizeof(Page));
            PageArray   = (Page *)kmap.Start;
            NextTryPage = PageArray;

            var firstSelfPageNum = KMath.DivFloor(kmap.Start, 4096);
            var selfPages        = KMath.DivFloor(kmap.Size, 4096);

            KernelMessage.WriteLine("Page Frame Array allocated {0} pages, beginning with page {1}", selfPages, firstSelfPageNum);

            PageTableExtensions.SetWritable(PageTable.KernelTable, kmap.Start, kmap.Size);
            kmap.Clear();

            var addr = FistPageNum * 4096;

            for (uint i = 0; i < _TotalPages; i++)
            {
                PageArray[i].Address = addr;
                //if (i != 0)
                //    PageArray[i - 1].Next = &PageArray[i];
                addr += 4096;
            }

            SetupFreeMemory();

            _FreePages = 0;
            for (uint i = 0; i < _TotalPages; i++)
            {
                if (PageArray[i].Status == PageStatus.Free)
                {
                    _FreePages++;
                }
            }

            KernelMessage.WriteLine("Pages Free: {0}", FreePages);
        }
Esempio n. 6
0
        public void Initialize(MemoryRegion region, Page *pages, AddressSpaceKind addressSpaceKind)
        {
            _Requests = 0;
            _Releases = 0;

            KernelMessage.WriteLine("Init SimplePageAllocator");
            AddressSpaceKind = addressSpaceKind;
            _Region          = region;
            Pages            = pages;
            FirstPageNum     = region.Start / 4096;
            _FreePages       = region.Size / 4096;
            _TotalPages      = region.Size / 4096;
            var addr = region.Start;

            for (var i = 0; i < _TotalPages; i++)
            {
                Pages[i].Address = addr;
                addr            += 4096;
            }
        }
Esempio n. 7
0
        private static bool CheckPageIsUsableAfterMap(KernelMemoryMap map, USize size, AddressSpaceKind addressSpaceKind)
        {
            var tryMap = new KernelMemoryMap(map.Start + map.Size, size, BootInfoMemoryType.Unknown, addressSpaceKind);

            if (Header->Used.Intersects(tryMap))
            {
                return(false);
            }

            if (Header->KernelReserved.Intersects(tryMap))
            {
                return(false);
            }

            if (!Header->SystemUsable.Contains(tryMap))
            {
                return(false);
            }

            return(true);
        }
Esempio n. 8
0
        public static BootInfoMemory AllocateMemoryMap(USize size, BootInfoMemoryType type, AddressSpaceKind addressSpaceKind)
        {
            var map = new BootInfoMemory
            {
                Start            = PageStartAddr,
                Size             = size,
                Type             = type,
                AddressSpaceKind = addressSpaceKind,
                PreMap           = true,
            };

            PageStartAddr += size;

            KernelMessage.WriteLine("Allocated MemoryMap of Type {0} at {1:X8} with Size {2:X8}", (uint)type, map.Start, map.Size);

            return(map);
        }