static void MapKernelImage() { var phys = Address.KernelElfSection; var diff = Address.KernelBaseVirt - Address.KernelBasePhys; var endPhys = phys + OriginalKernelElf.TotalFileSize; var addr = phys; KernelMessage.WriteLine("Mapping Kernel Image from physical {0:X8} to virtual {1:X8}", phys, phys + diff); while (addr < endPhys) { PageTable.MapVirtualAddressToPhysical(addr + diff, addr); addr += 0x1000; } }
/// <summary> /// Returns raw, unmanaged Memory. /// Consumer: Kernel, Memory allocators /// Shoud be used for larger Chunks. /// </summary> internal unsafe static Addr RequestRawVirtalMemoryPages(uint pages) { Addr virt = _nextVirtAddr; var head = PageFrameManager.AllocatePages(PageFrameRequestFlags.Default, pages); if (head == null) { return(Addr.Zero); } var p = head; for (var i = 0; i < pages; i++) { PageTable.MapVirtualAddressToPhysical(_nextVirtAddr, p->PhysicalAddress); _nextVirtAddr += 4096; p = p->Next; } return(virt); }