private static void MapKernelImage() { var phys = Address.KernelElfSectionPhys; 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.KernelTable.MapVirtualAddressToPhysical(addr + diff, addr); addr += 0x1000; } PageTable.KernelTable.Flush(); var map = new BootInfoMemory { Start = phys + diff, Size = OriginalKernelElf.TotalFileSize, Type = BootInfoMemoryType.KernelElfVirt, AddressSpaceKind = AddressSpaceKind.Virtual, }; BootInfo_.AddMap(map); }
private static bool Initial_CheckPageIsUsableAfterMap(BootInfoMemory map) { if (map.Type == BootInfoMemoryType.SystemUsable) { return(false); } Addr checkAddr = map.Start + map.Size; var inUsableSystemMap = false; for (uint i = 0; i < BootInfo.Header->MemoryMapLength; i++) { if (BootInfo.Header->MemoryMapArray[i].Type == BootInfoMemoryType.SystemUsable) { if (AddressInMap(checkAddr, BootInfo.Header->MemoryMapArray[i])) { inUsableSystemMap = true; } } else { if (AddressInMap(checkAddr, BootInfo.Header->MemoryMapArray[i])) { return(false); } } } return(inUsableSystemMap); }
public static void AddMap(BootInfoMemory map) { Assert.False(BootInfo->MemoryMapLength >= MemoryMapReserve); BootInfo->MemoryMapArray[BootInfo->MemoryMapLength] = map; BootInfo->MemoryMapLength++; }
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); }
private static bool AddressInMap(Addr addr, BootInfoMemory map) { return(map.Start <= addr && addr < map.Start + map.Size); }