Beispiel #1
0
        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();
        }
Beispiel #2
0
 /// <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;
     }
 }
Beispiel #3
0
        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;
            //}
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
 public static void *MapFreePage(VirtMemImpl.PageFlags flags)
 {
     return(MapFreePages(flags, 1));
 }
Beispiel #6
0
 /// <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);
 }