public static void Setup() { var addr = Initial_FindIFreePage(); KernelMessage.Path("KernelMemoryMapManager", "Initial Page: {0:X}", addr); // 80KB should be enough // TODO: Check if really 80KB are available after this address. InitialMap = new KernelMemoryMap(addr, 0x1000 * 20, BootInfoMemoryType.KernelMemoryMap); Memory.InitialKernelProtect_MakeWritable_BySize(InitialMap.Start, InitialMap.Size); Header = (KernelMemoryMapHeader *)InitialMap.Start; var arrayOffset1 = 0x1000; var arrayOffset2 = 0x3000; Header->SystemUsable = new KernelMemoryMapArray((KernelMemoryMap *)(InitialMap.Start + arrayOffset1), 50); Header->Used = new KernelMemoryMapArray((KernelMemoryMap *)(InitialMap.Start + arrayOffset2), 100); for (uint i = 0; i < BootInfo.Header->MemoryMapLength; i++) { var map = BootInfo.Header->MemoryMapArray[i]; var kmap = new KernelMemoryMap(map.Start, map.Size, map.Type); if (kmap.Type == BootInfoMemoryType.SystemUsable) { Header->SystemUsable.Add(kmap); } else { Header->Used.Add(kmap); } } Header->Used.Add(InitialMap); //Debug_FillAvailableMemory(); }
public static void Setup() { var addr = Initial_FindFreePage(); KernelMessage.Path("KernelMemoryMapManager", "Initial Page: {0:X}", addr); PageTable.KernelTable.Map(addr, addr, flush: true); // 80KB should be enough // TODO: Check if really 80KB are available after this address. InitialMap = new KernelMemoryMap(addr, 0x1000 * 20, BootInfoMemoryType.KernelMemoryMap, AddressSpaceKind.Both); PageTable.KernelTable.Map(InitialMap.Start, InitialMap.Start, InitialMap.Size, flush: true); PageTable.KernelTable.SetWritable(InitialMap.Start, InitialMap.Size); Header = (KernelMemoryMapHeader *)InitialMap.Start; var arrayOffset1 = 0x1000; var arrayOffset2 = 0x2000; var arrayOffset3 = 0x3000; Header->SystemUsable = new KernelMemoryMapArray((KernelMemoryMap *)(InitialMap.Start + arrayOffset1), 50); Header->Used = new KernelMemoryMapArray((KernelMemoryMap *)(InitialMap.Start + arrayOffset2), 100); Header->KernelReserved = new KernelMemoryMapArray((KernelMemoryMap *)(InitialMap.Start + arrayOffset3), 100); for (uint i = 0; i < BootInfo.Header->MemoryMapLength; i++) { var map = BootInfo.Header->MemoryMapArray[i]; var kmap = new KernelMemoryMap(map.Start, map.Size, map.Type, map.AddressSpaceKind); if (kmap.Type == BootInfoMemoryType.SystemUsable) { Header->SystemUsable.Add(kmap); } else { if (kmap.Type == BootInfoMemoryType.KernelReserved) { Header->KernelReserved.Add(kmap); } else { Header->Used.Add(kmap); } } } Header->Used.Add(InitialMap); KernelMessage.Path("KernelMemoryMapManager", "Filling Lists Done. SystemUsable: {0}, CustomReserved: {1}, Used: {2}", Header->SystemUsable.Count, Header->KernelReserved.Count, Header->Used.Count); PrintMapArrays(); //Debug_FillAvailableMemory(); }