public void Load(bool ProcessIsUM) { VirtMemImpl.PageFlags flags = ProcessIsUM ? VirtMemImpl.PageFlags.None : VirtMemImpl.PageFlags.KernelOnly; UInt32Dictionary.Iterator iterator = CodePages.GetIterator(); while (iterator.HasNext()) { UInt32Dictionary.KeyValuePair pair = iterator.Next(); uint vAddr = pair.Key; uint pAddr = pair.Value; #if MEMLAYOUT_TRACE BasicConsole.WriteLine("Loading code page..."); #endif VirtMemManager.Map(pAddr, vAddr, 4096, flags, UpdateUsedPagesFlags.Virtual); } iterator.RestoreState(); flags = ProcessIsUM ? VirtMemImpl.PageFlags.None : VirtMemImpl.PageFlags.KernelOnly; iterator = DataPages.GetIterator(); while (iterator.HasNext()) { UInt32Dictionary.KeyValuePair pair = iterator.Next(); uint vAddr = pair.Key; uint pAddr = pair.Value; #if MEMLAYOUT_TRACE BasicConsole.WriteLine("Loading data page..."); #endif VirtMemManager.Map(pAddr, vAddr, 4096, flags, UpdateUsedPagesFlags.Virtual); } iterator.RestoreState(); }
/// <summary> /// Maps the specified amount of memory. /// </summary> /// <param name="pAddr">The physical address to start mapping at (must be 4KiB aligned).</param> /// <param name="vAddr">The virtual address to start mapping at (must be 4KiB aligned).</param> /// <param name="size">The amount of memory (in bytes) to map (must be a multiple of 4KiB)</param> /// <param name="flags">The flags to apply to the allocated pages.</param> /// <param name="UpdateUsedPages">Which, if any, of the physical and virtual used pages lists to update.</param> public static void Map(uint pAddr, uint vAddr, uint size, VirtMemImpl.PageFlags flags, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { flags |= VirtMemImpl.PageFlags.Present | VirtMemImpl.PageFlags.Writeable; while (size > 0) { impl.Map(pAddr, vAddr, flags, UpdateUsedPages); size -= 4096; pAddr += 4096; vAddr += 4096; } }
public void Load(bool ProcessIsUM) { VirtMemImpl.PageFlags flags = ProcessIsUM ? VirtMemImpl.PageFlags.None : VirtMemImpl.PageFlags.KernelOnly; for (int i = 0; i < CodePages.Keys.Count; i++) { uint vAddr = CodePages.Keys[i]; uint pAddr = CodePages[vAddr]; #if MEMLAYOUT_TRACE BasicConsole.WriteLine("Loading code page..."); #endif //if (loadPrint) //{ // BasicConsole.WriteLine(((FOS_System.String)"Loading code page v->p: ") + vAddr + " -> " + pAddr); //} VirtMemManager.Map(pAddr, vAddr, 4096, flags, UpdateUsedPagesFlags.Virtual); } flags = ProcessIsUM ? VirtMemImpl.PageFlags.None : VirtMemImpl.PageFlags.KernelOnly; for (int i = 0; i < DataPages.Keys.Count; i++) { uint vAddr = DataPages.Keys[i]; uint pAddr = DataPages[vAddr]; #if MEMLAYOUT_TRACE BasicConsole.WriteLine("Loading data page..."); #endif //if (loadPrint) //{ // BasicConsole.WriteLine(((FOS_System.String)"Loading data page v->p: ") + vAddr + " -> " + pAddr); //} VirtMemManager.Map(pAddr, vAddr, 4096, flags, UpdateUsedPagesFlags.Virtual); } //if (loadPrint) //{ // //BasicConsole.DelayOutput(1); // loadPrint = false; //} }
public static void *MapFreePages(VirtMemImpl.PageFlags flags, int numPages) { uint virtAddrsStart = 0xDEADBEEF; try { MapFreePagesLock.Enter(); //BasicConsole.WriteLine("Mapping free pages:"); uint physAddrsStart = impl.FindFreePhysPageAddrs(numPages); virtAddrsStart = impl.FindFreeVirtPageAddrs(numPages); //BasicConsole.Write(" -- Phys start: "); //BasicConsole.WriteLine(physAddrsStart); //BasicConsole.Write(" -- Virt start: "); //BasicConsole.WriteLine(virtAddrsStart); //BasicConsole.Write(" -- Num pages: "); //BasicConsole.WriteLine(numPages); for (uint i = 0; i < numPages; i++) { Map(physAddrsStart + (i * 4096), virtAddrsStart + (i * 4096), 4096, flags); } } finally { MapFreePagesLock.Exit(); } if (virtAddrsStart == 0xDEADBEEF) { BasicConsole.WriteLine("!!! PANIC !!!"); BasicConsole.WriteLine("VirtMemManager.MapFreePages returning 0xDEADBEEF!"); BasicConsole.WriteLine("!-!-!-!-!-!-!"); } return((void *)virtAddrsStart); }
public static void *MapFreePage(VirtMemImpl.PageFlags flags) { return(MapFreePages(flags, 1)); }
/// <summary> /// Maps the specified amount of memory. /// </summary> /// <param name="pAddr">The physical address to start mapping at (must be 4KiB aligned).</param> /// <param name="vAddr">The virtual address to start mapping at (must be 4KiB aligned).</param> /// <param name="size">The amount of memory (in bytes) to map (must be a multiple of 4KiB)</param> /// <param name="flags">The flags to apply to the allocated pages.</param> /// <param name="UpdateUsedPages">Which, if any, of the physical and virtual used pages lists to update.</param> public static void Map(void *pAddr, uint vAddr, uint size, VirtMemImpl.PageFlags flags, UpdateUsedPagesFlags UpdateUsedPages = UpdateUsedPagesFlags.Both) { Map((uint)pAddr, vAddr, size, flags, UpdateUsedPages); }