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); }
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); }
private void SetInitialPageStatus(KernelMemoryMapArray *maps, PageStatus status) { for (var i = 0; i < maps->Count; i++) { var map = maps->Items[i]; if (map.Start >= BootInfo.Header->InstalledPhysicalMemory) { continue; } if ((map.AddressSpaceKind & AddressSpaceKind.Physical) == 0) { continue; } var mapPages = KMath.DivCeil(map.Size, 4096); var fistPageNum = KMath.DivFloor(map.Start, 4096); KernelMessage.WriteLine("Mark Pages from {0:X8}, Size {1:X8}, Type {2}, FirstPage {3}, Pages {4}, Status {5}", map.Start, map.Size, (uint)map.Type, (uint)fistPageNum, mapPages, (uint)status); for (var p = fistPageNum; p < fistPageNum + mapPages; p++) { var addr = p * 4096; if (!Region.Contains(addr)) { continue; } if (addr >= BootInfo.Header->InstalledPhysicalMemory) { KernelMessage.WriteLine("addr >= BootInfo.Header->InstalledPhysicalMemory"); break; } var page = GetPageByNum(p); Assert.IsSet(page, "page == null"); page->Status = status; } } }